洛谷 3203 HNOI2010 BOUNCE 弹飞绵羊
【题解】
这道题可以用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 弹飞绵羊相关推荐
- 分块-洛谷P3203 [HNOI2010]BOUNCE 弹飞绵羊
https://www.luogu.org/problem/show?pid=3203#sub 这道题第一次TLEl,然后改了改变成AC: 所以说这种题目,时限卡得很紧,一定要思考理论复杂度和常数的问 ...
- AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203
[HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...
- 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 https://www.lydsy.com/JudgeOnline/problem.php?id=2002 分析: 绵羊在弹飞的路径中相当于一棵 ...
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 10761 Solved: 5542 [Su ...
- [BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊(分块)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [HNOI2010]BOUNCE 弹飞绵羊
题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊
n<=200000个点,从i会跳到$i+num_i$,保证$num_i>0$,m<=100000个两种操作:一.修改一个$num$:二.问从$i$开始跳多少步跳出这个序列. 大概是L ...
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【LCT】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一道LCT,调了3天,发现是智障bug,我的青春... 主要参考了黄学长的代码,也没 ...
最新文章
- 本质矩阵与基本矩阵(对极几何)
- U盘安装Centos6.3 续
- evernote100个做笔记的好方法
- SQLServer书写规范梳理
- Android之CSDN 牛人博客索引
- 竟然有如何奇葩的如厕方式......
- 内核热补丁,真的安全么?
- 解决 IntelliJ IDEA 读取不了 datasource.properties
- 小熊派开发实践丨小熊派+合宙Cat.1接入云服务器
- 一篇文章带你快速入门JavaScript(自学者福利)
- webtop搭建简单知识库粗略介绍
- socket的原理和实验
- 互联网运营和传统运营,到底有什么区别
- Ubuntu18.04 安装运行windows程序(qq 微信 caj阅读器等)+解决wine中文乱码
- 攻防世界pwn高手进阶(持续更新)
- 第一章 红绿灯数据采集
- sticky的基本使用
- 请把ios文件解压出来是什么意思_全网电影+美剧+日韩剧(ios+安卓)
- 修改MySQL 数据库 密码
- 分子影像有哪些最新发表的毕业论文呢?