2002: [Hnoi2010]Bounce 弹飞绵羊

https://www.lydsy.com/JudgeOnline/problem.php?id=2002

分析:

  绵羊在弹飞的路径中相当于一棵树,这棵树需要更改形态,删一条边,加一条边,所以LCT维护一下。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4
 5 inline int read() {
 6     int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
 7     for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
 8 }
 9
10 const int N = 200100;
11 int ch[N][2],fa[N],rev[N],val[N],siz[N],sk[N],a[N],Top,n;
12
13 void pushup(int x) {
14     siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1;
15 }
16 void pushdown(int x) {
17     if (rev[x]) {
18         rev[ch[x][0]] ^= 1; rev[ch[x][1]] ^= 1;
19         swap(ch[x][0], ch[x][1]);
20         rev[x] ^= 1;
21     }
22 }
23 bool isroot(int x) {
24     return ch[fa[x]][0] != x && ch[fa[x]][1] != x;
25 }
26 int son(int x) {
27     return x == ch[fa[x]][1];
28 }
29 void rotate(int x) {
30     int y = fa[x],z = fa[y],b = son(x),c = son(y),a = ch[x][!b];
31     if (!isroot(y)) ch[z][c] = x;fa[x] = z;
32     ch[x][!b] = y;fa[y] = x;
33     ch[y][b] = a;if (a) fa[a] = y;
34     pushup(y);pushup(x);
35 }
36 void splay(int x) {
37     sk[Top = 1] = x;
38     for (int i=x; !isroot(i); i=fa[i]) sk[++Top] = fa[i];
39     while (Top) pushdown(sk[Top--]);
40     while (!isroot(x)) {
41         int y = fa[x];
42         if (isroot(y)) rotate(x);
43         else {
44             if (son(x) == son(y)) rotate(y), rotate(x);
45             else rotate(x), rotate(x);
46         }
47     }
48 }
49 void access(int x) {
50     for (int last=0; x; last=x, x=fa[x]) {
51         splay(x); ch[x][1] = last; pushup(x);
52     }
53 }
54 void makeroot(int x) {
55     access(x); splay(x); rev[x] ^= 1;
56 }
57 int find(int x) {
58     access(x); splay(x);
59     while (ch[x][0]) x = ch[x][0];
60     return x;
61 }
62 void link(int x,int y) {
63     makeroot(x);
64     fa[x] = y;
65 }
66 void cut(int x,int y) {
67     makeroot(x); access(y); splay(y);
68     if (fa[x] == y && !ch[x][1]) fa[x] = ch[y][0] = 0;
69 }
70
71 void query() {
72     makeroot(n + 1);
73     int p = read() + 1;
74     access(p);
75     splay(p);
76     printf("%d\n",siz[p] - 1);
77 }
78 void change() {
79     int p = read() + 1,x = read(),t = p+x > n+1 ? n+1: p+x; // --- 判断是否大于n+1,不判luogu上80
80     cut(p,a[p]);
81     a[p] = t;
82     link(p,a[p]);
83 }
84
85 int main() {
86     n = read();
87     for (int i=1; i<=n; ++i) {
88         a[i] = i + read();
89         a[i] = a[i] > n+1 ? n+1 : a[i];
90     }
91     for (int i=1; i<=n; ++i) link(i,a[i]);
92     int m = read();
93     while (m--) {
94         int opt = read();
95         if (opt == 1) query();
96         else change();
97     }
98     return 0;
99 }

转载于:https://www.cnblogs.com/mjtcn/p/9301369.html

2002: [Hnoi2010]Bounce 弹飞绵羊相关推荐

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

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

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

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

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

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

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

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

  5. HYSBZ - 2002 :Bounce 弹飞绵羊 (分块算法)

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

  6. [HNOI2010]BOUNCE 弹飞绵羊

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

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

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

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

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

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

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

最新文章

  1. 全面解析多种区块链隐私保护解决方案
  2. Perl中的正则表达式
  3. Servlet 与 CGI 的比较
  4. LeetCode 300最长递增子序列
  5. python 函数
  6. 移动创业者,这么多免费资源,你不要?
  7. 去掉 AD13 PCB网络连线中的双斜杠
  8. 程序员值得提升的沟通小技巧!
  9. 怎么看rx580是不是470刷的_AMD RX470/570强刷RX580完整图文教程(附文件下载及查BIOS攻略)...
  10. 3.2、关于Support for password authentication was removed on August 13, 2021报错的解决方案
  11. 一文带你了解什么是CDN
  12. 2021年安全员-C证(陕西省)考试总结及安全员-C证(陕西省)模拟考试系统
  13. 2021信息安全工程师学习笔记(四)
  14. 惊!西游记内幕竟是这样的。
  15. 基于Win10的Peach下载安装以及Modbus模糊测试
  16. Win10更改账户类型为标准改不了怎么办
  17. Dpabi数据分析的结构
  18. 基于STM32智能人体红外和声音感应声光控开关设计
  19. matlab qpsk 星座图,【求助】如何画QPSK信号的星座图?各位高手帮帮忙啊!小弟...
  20. 事件抽取与事理图谱(二)

热门文章

  1. ldap导入mysql_openLDAP 部署(亲测可用)
  2. 在计算机硬盘中没有什么,如果在打开计算机后找不到硬盘,应该怎么办?
  3. win7配置计算机失败怎么办,电脑win7配置失败 还原更新 怎么处理 不要说重装
  4. php去字符串空格,php怎么去掉字符串中空格
  5. python为text添加滚动条_Python GUI编程(Tkinter)7、带滚动条的Text
  6. pandas concat_pandas合并几百个csv只需要一分钟?(含代码,拿去即可用)
  7. grep 显示前后几行
  8. Eclipse中svn插件:Subclipse插件安装
  9. 怎么改vue项目的标题_如何动态修改Vue项目中的页面title
  10. python综合管理系统_学生综合信息管理系统