【题解】

  这道题可以用Link-Cut Tree写。。

  首先建立一个虚拟节点N+1,$i$与$N+1$连边表示$i$被弹飞了

  对于修改操作,先$cut(i,min(n+1,i+k[i]))$,然后再$link(i,min(n+1,i+newk))$

  对于询问操作,先$makeroot(x)$,然后$splay(n+1)$,$access(n+1)$,那么答案就是$size[n+1]-1$

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N (500010)
 4 #define ls (c[u][0])
 5 #define rs (c[u][1])
 6 using namespace std;
 7 int n,m,opt,k[N];
 8 inline int read(){
 9     int k=0,f=1; char c=getchar();
10     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
11     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
12     return k*f;
13 }
14 struct Link_Cut_Tree{
15     int top,c[N][2],fa[N],rev[N],size[N],q[N];
16     inline void pushdown(int u){
17         if(rev[u]) rev[ls]^=1,rev[rs]^=1,rev[u]^=1,swap(ls,rs);
18     }
19     inline void pushup(int u){
20         size[u]=1;
21         if(ls) size[u]+=size[ls];
22         if(rs) size[u]+=size[rs];
23     }
24     inline bool isroot(int u){
25         return c[fa[u]][0]!=u&&c[fa[u]][1]!=u;
26     }
27     inline bool which(int u){
28         return c[fa[u]][1]==u;
29     }
30     void rotate(int u){
31         int f=fa[u],gf=fa[f],wh=which(u);
32         if(!isroot(f)) c[gf][which(f)]=u;
33         fa[u]=gf; fa[f]=u; fa[c[u][wh^1]]=f;
34         c[f][wh]=c[u][wh^1]; c[u][wh^1]=f;
35         pushup(f); pushup(u);
36     }
37     void splay(int u){
38         q[top=1]=u;
39         for(int i=u;!isroot(i);i=fa[i]) q[++top]=fa[i];
40         for(int i=top;i;i--) pushdown(q[i]);
41         while(!isroot(u)){
42             if(!isroot(fa[u])) rotate(which(u)==which(fa[u])?fa[u]:u);
43             rotate(u);
44         }
45         pushup(u);
46     }
47     void access(int u){
48         for(int son=0;u;son=u,u=fa[u])
49             splay(u),c[u][1]=son,pushup(u);
50     }
51     void makeroot(int u){
52         access(u); splay(u); rev[u]^=1;
53     }
54     int find(int u){
55         access(u); splay(u);
56         while(ls) u=ls; splay(u);
57         return u;
58     }
59     void split(int x,int y){
60         makeroot(x); access(y); splay(y);
61     }
62     void cut(int x,int y){
63         int xrt=find(x),yrt=find(y);
64         if(xrt!=yrt) return;
65         split(x,y);
66         if(c[y][0]==x) c[y][0]=0,fa[x]=0;
67         pushup(y);
68     }
69     void link(int x,int y){
70         int xrt=find(x),yrt=find(y);
71         if(xrt==yrt) return;
72         makeroot(x); fa[x]=y;
73     }
74 }t;
75 int main(){
76     n=read();
77     for(int i=1;i<=n;i++) t.link(i,min(n+1,i+(k[i]=read())));
78     m=read();
79     while(m--){
80         if((opt=read())==1){
81             int x=read()+1;
82             t.makeroot(x); t.access(n+1); t.splay(n+1);
83             printf("%d\n",t.size[n+1]-1);
84         }
85         else{
86             int x=read()+1,y=read();
87             if(x+y>n+1&&x+k[x]>n+1) continue;
88             t.cut(x,min(n+1,x+k[x]));
89             t.link(x,min(n+1,x+y));
90             k[x]=y;
91         }
92     }
93     return 0;
94 }

View Code

转载于:https://www.cnblogs.com/DriverLao/p/8270720.html

洛谷 3203 HNOI2010 BOUNCE 弹飞绵羊相关推荐

  1. 分块-洛谷P3203 [HNOI2010]BOUNCE 弹飞绵羊

    https://www.luogu.org/problem/show?pid=3203#sub 这道题第一次TLEl,然后改了改变成AC: 所以说这种题目,时限卡得很紧,一定要思考理论复杂度和常数的问 ...

  2. AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203

    [HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  3. 2002: [Hnoi2010]Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 https://www.lydsy.com/JudgeOnline/problem.php?id=2002 分析: 绵羊在弹飞的路径中相当于一棵 ...

  4. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 10761  Solved: 5542 [Su ...

  5. [BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊(分块)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  6. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  7. [HNOI2010]BOUNCE 弹飞绵羊

    题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...

  8. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...

  9. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊

    n<=200000个点,从i会跳到$i+num_i$,保证$num_i>0$,m<=100000个两种操作:一.修改一个$num$:二.问从$i$开始跳多少步跳出这个序列. 大概是L ...

  10. bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【LCT】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一道LCT,调了3天,发现是智障bug,我的青春... 主要参考了黄学长的代码,也没 ...

最新文章

  1. 本质矩阵与基本矩阵(对极几何)
  2. U盘安装Centos6.3 续
  3. evernote100个做笔记的好方法
  4. SQLServer书写规范梳理
  5. Android之CSDN 牛人博客索引
  6. 竟然有如何奇葩的如厕方式......
  7. 内核热补丁,真的安全么?
  8. 解决 IntelliJ IDEA 读取不了 datasource.properties
  9. 小熊派开发实践丨小熊派+合宙Cat.1接入云服务器
  10. 一篇文章带你快速入门JavaScript(自学者福利)
  11. webtop搭建简单知识库粗略介绍
  12. socket的原理和实验
  13. 互联网运营和传统运营,到底有什么区别
  14. Ubuntu18.04 安装运行windows程序(qq 微信 caj阅读器等)+解决wine中文乱码
  15. 攻防世界pwn高手进阶(持续更新)
  16. 第一章 红绿灯数据采集
  17. sticky的基本使用
  18. 请把ios文件解压出来是什么意思_全网电影+美剧+日韩剧(ios+安卓)
  19. 修改MySQL 数据库 密码
  20. 分子影像有哪些最新发表的毕业论文呢?

热门文章

  1. 判断 wp 是否是活跃页面
  2. ExtJS 4中动态加载的路径设置
  3. 【CIKM2020】如何更为合适地评测推荐算法? Top-N物品推荐算法评测设置回顾
  4. ACL2020 | 词向量性别偏见
  5. 【脑洞大开】假如BERT系列论文变成Commit History
  6. 【每日算法Day 91】求解数组中出现次数超过1/3的那个数
  7. 图论算法——有向图中的强连通性
  8. Oracle 10g宝典(第2版)
  9. 实践出真知--ZAC《网络营销实战密码》
  10. 嵌入式系统开发快速体验