洛谷 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$
- #include<cstdio>
- #include<algorithm>
- #define N (500010)
- #define ls (c[u][0])
- #define rs (c[u][1])
- using namespace std;
- int n,m,opt,k[N];
- inline int read(){
- int k=,f=; char c=getchar();
- while(c<''||c>'')c=='-'&&(f=-),c=getchar();
- while(''<=c&&c<='')k=k*+c-'',c=getchar();
- return k*f;
- }
- struct Link_Cut_Tree{
- int top,c[N][],fa[N],rev[N],size[N],q[N];
- inline void pushdown(int u){
- if(rev[u]) rev[ls]^=,rev[rs]^=,rev[u]^=,swap(ls,rs);
- }
- inline void pushup(int u){
- size[u]=;
- if(ls) size[u]+=size[ls];
- if(rs) size[u]+=size[rs];
- }
- inline bool isroot(int u){
- return c[fa[u]][]!=u&&c[fa[u]][]!=u;
- }
- inline bool which(int u){
- return c[fa[u]][]==u;
- }
- void rotate(int u){
- int f=fa[u],gf=fa[f],wh=which(u);
- if(!isroot(f)) c[gf][which(f)]=u;
- fa[u]=gf; fa[f]=u; fa[c[u][wh^]]=f;
- c[f][wh]=c[u][wh^]; c[u][wh^]=f;
- pushup(f); pushup(u);
- }
- void splay(int u){
- q[top=]=u;
- for(int i=u;!isroot(i);i=fa[i]) q[++top]=fa[i];
- for(int i=top;i;i--) pushdown(q[i]);
- while(!isroot(u)){
- if(!isroot(fa[u])) rotate(which(u)==which(fa[u])?fa[u]:u);
- rotate(u);
- }
- pushup(u);
- }
- void access(int u){
- for(int son=;u;son=u,u=fa[u])
- splay(u),c[u][]=son,pushup(u);
- }
- void makeroot(int u){
- access(u); splay(u); rev[u]^=;
- }
- int find(int u){
- access(u); splay(u);
- while(ls) u=ls; splay(u);
- return u;
- }
- void split(int x,int y){
- makeroot(x); access(y); splay(y);
- }
- void cut(int x,int y){
- int xrt=find(x),yrt=find(y);
- if(xrt!=yrt) return;
- split(x,y);
- if(c[y][]==x) c[y][]=,fa[x]=;
- pushup(y);
- }
- void link(int x,int y){
- int xrt=find(x),yrt=find(y);
- if(xrt==yrt) return;
- makeroot(x); fa[x]=y;
- }
- }t;
- int main(){
- n=read();
- for(int i=;i<=n;i++) t.link(i,min(n+,i+(k[i]=read())));
- m=read();
- while(m--){
- if((opt=read())==){
- int x=read()+;
- t.makeroot(x); t.access(n+); t.splay(n+);
- printf("%d\n",t.size[n+]-);
- }
- else{
- int x=read()+,y=read();
- if(x+y>n+&&x+k[x]>n+) continue;
- t.cut(x,min(n+,x+k[x]));
- t.link(x,min(n+,x+y));
- k[x]=y;
- }
- }
- return ;
- }
洛谷 3203 HNOI2010 BOUNCE 弹飞绵羊的更多相关文章
- [BZOJ2002][洛谷P3203][Hnoi2010]Bounce 弹飞绵羊(LCT维护链长)
luogu传送门 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 16082 Solved: ...
- AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203
[HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 9071 Solved: 4652[Submi ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 link-cut-tree
2016-05-30 11:51:59 用一个next数组,记录点x的下一个点是哪个 查询时,moveroot(n+1),access(x),splay(x) ,输出size[ch[x][0]]即为答 ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块
[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 4055 Solved: 2172[Submi ...
- bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...
随机推荐
- javascript的call和apply
coffeescript里,每个文件编译成JS后,都是(function(){...}).call(this);的架势 这个call,该怎么理解呢? 在javascript里面,call 或者 app ...
- 快速编译system.img和boot.img的方法【转】
本文转载自:http://www.cnblogs.com/wanqieddy/archive/2012/10/22/2734024.html 快速编译system.img,可以使用这个命令: #mak ...
- 【转载】HashMap实现原理浅析
HashMap和Hashtable的区别 两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全Hashtable的实现方法里面都添加了synchronized关键字来确保线程 ...
- 使用php实现二叉搜索树
看到一位大神写的js的搜索树,自己也按照模式写了一个php的二叉搜索树. <?phpclass node{ public $data; public $key; public $left=nul ...
- day01_12/11/2016_Spring入门PPT
s1 s2 s3 s4 s5 s6 s7 s8 IOC1 IOC2 入门编写1 入门编写2 入门编写3 入门编写4---心得
- 设置靠近 水平居中的主体内容Div 的 左侧位置固定的Div
示例效果: 1.主体内容的divMain 水平居中: 2.divLeft 靠近divMain ,位置固定,不随垂直滚动条而动: 相关代码: <html> <head runat=&q ...
- 重现apache commons fileupload DOS漏洞
这个漏洞是2014年2月4日被发现的, 因为该组件试用范围非常广, 所以该漏洞的影响也非常巨大.通过特制的包含畸形header的http请求,可以导致使用该组件的应用程序进入无限循环从而耗尽CPU等资 ...
- html5——多媒体(二)
基本方法 load() //重新加载视频 play() //播放 pause() //暂停 基本属性 currentTime //视频播放的当前进度. duration //视频的总时间 paused ...
- html5——文本阴影
基本结构 text-shadow: 30px 23px 31px #;/* 文字阴影: 水平位移 垂直位移 模糊程度 阴影颜色*/ 凹凸文字 <!DOCTYPE html> <htm ...
- 转载:使用FileReader对象的readAsDataURL方法来读取图像文件
文章转载自:http://blog.okbase.net/jquery2000/archive/1296.html: FileReader对象的readAsDataURL方法可以将读取到的文件编码成D ...