【bzoj2002】 [Hnoi2010]Bounce 弹飞绵羊

来源:互联网 发布:刚性兑付 知乎 编辑:程序博客网 时间:2024/05/16 02:47

非常裸的裸题……
很明显每个点跳到的点的编号一定大于当前点,那么整个跳的图就形成了一个树结构,每个点的父亲节点定义为min(i+k,n)
这样搞之后,操作1就是查询某个点的深度,操作2就是换父亲
大概可以用dfs序搞
/这个坑以后再填好了/
反正只有换父亲嘛。。。来发lct就好啦2333
作死地写了单旋然后T掉了= =

#include <bits/stdc++.h>using namespace std;#define For(i,a,b) for(int i=a;i<b;i++)#define lc ch[u][0]#define rc ch[u][1]#define maxn 200003inline int rd() {    char c = getchar();    while (!isdigit(c)) c = getchar() ; int x = c - '0';    while (isdigit(c = getchar())) x = x * 10 + c - '0';    return x;}typedef int arr[maxn];arr fa , size , rv , sta;int ch[maxn][2] , top , n , m;inline bool isrt(int u) { return (ch[fa[u]][0] != u) && (ch[fa[u]][1] != u) ; }inline void mt(int u) { if (u) size[u] = 1 + (lc ? size[lc] : 0) + (rc ? size[rc] : 0) ; }inline void ps(int u) { if (u && rv[u]) swap(lc , rc) , rv[lc] ^= 1 , rv[rc] ^= 1 , rv[u] = 0; }inline void rot(int u) {    int f = fa[u] , g = fa[f] , l , r;    l = (ch[f][1] == u) , r = l ^ 1;    if (!isrt(f)) ch[g][ch[g][1] == f] = u;    fa[u] = g , fa[f] = u;if (ch[u][r]) fa[ch[u][r]] = f;    ch[f][l] = ch[u][r] , ch[u][r] = f;    mt(f) , mt(u);}inline void clear(int u) {    for(sta[top ++] = u;!isrt(u);u = fa[u]) sta[top ++] = fa[u];    for(;top;) ps(sta[-- top]);}inline void splay(int u) {    for(clear(u);!isrt(u);rot(u)) {        int f = fa[u] , g = fa[f];        if (!isrt(f)) rot(((ch[f][1] == u) ^ (ch[g][1] == f)) ? u : f);    }    mt(u);}inline void access(int u) {    int v = u;    for(int t = 0;u;t = u , u = fa[u])        splay(u) , rc = t ;    splay(v);}inline void mkrt(int u) { access(u) ; rv[u] ^= 1 ; ps(u) ; }inline void link(int u , int v) { mkrt(u) , fa[u] = v ; }inline void cut(int u) {    mkrt(n + 1);    access(u);    fa[lc] = 0 , lc = 0 , mt(u);}inline int get_dep(int u) {    mkrt(u);    access(n + 1);    return size[n + 1] - 1;}inline int get_par(int u , int k) { u += k ; if (u > n) u = n + 1 ; return u ; }int main() {    #ifndef ONLINE_JUDGE        freopen("data.txt" , "r" , stdin);        freopen("data.out" , "w" , stdout);    #endif    n = rd();    For(i , 1 , n + 1) link(i , get_par(i , rd()));    m = rd();    For(i , 0 , m) {        int a = rd() , b = rd() + 1 , c;        if (a == 2) {            c = rd();            cut(b);            link(b , get_par(b , c));        } else            printf("%d\n" , get_dep(b));    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在msdn里下的系统没有网怎么办 w7电脑更新后系统没法激活怎么办 手机使用加速器后网速变卡怎么办 奥特曼ol分解了迪迦石像怎么办 左右棋牌游戏兑换总说系统护怎么办 四季海棠扦插以后黄叶卷叶怎么办 竹节海棠浇水多了叶子蔫了怎么办 社保停缴了里面的钱怎么办 王者荣耀英雄释放技能有延迟怎么办 买的桑拿木板颜色太深了怎么办 万一填写了奔跑吧诈骗信息该怎么办 深圳限行时段堵在路上怎么办 开车堵在路上到了限行时间怎么办 兄妹之间都不想照顾母亲我该怎么办 小孩扁体发炎睡觉呼吸声沉重怎么办 客所思pk3老驱动有杂音怎么办 手机打不开解压包密码怎么办 在香港专柜买东西柜员少给货怎么办 恶魔猎手第二神器任务没选择怎么办 电脑放久了开不了机怎么办 你在主持时说错话了怎么办 1、你在主持时说错话了怎么办? 领导让你替他参加重要会议怎么办 在备孕期老公照了片怎么办 和混混打架后被混混纠缠怎么办 开了一年的瑜伽馆想关掉会员怎么办 广东工厂宿舍里面床板有臭虫怎么办 胃癌手术后12天引流液多怎么办 八个月了胎儿头还在上面怎么办 喂奶一个月后奶头又裂开了怎么办 孩子吃奶吃的奶头裂开了怎么办 很想打坐久就是受不了腿疼怎么办 宝宝含乳一直纠正不过来怎么办 婴儿衘乳不正确只吸乳头怎么办 怀孕7个月了晚上睡不着怎么办 尚德学校学费交了一半退学怎么办 随着年龄的增长胸越来越来小怎么办 运动文胸里边的海绵垫会乱跑怎么办 带胸罩时在外面忽然扣子开了怎么办 我的脸一边大一边小怎么办 桶装水盖子吸在饮水机了怎么办?