bzoj4764: 弹飞大爷 link-cut-tree
这道题啊 调了一个晚上 因为写的是一个有根树和n个基环的写法 所以写得很奇怪..... 最后发现单独处理树的时候不能随意改变S(就是原来的根)不然size会出错....
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- using namespace std;
- const int M=;
- int read(){
- int ans=,f=,c=getchar();
- while(c<''||c>''){if(c=='-') f=-; c=getchar();}
- while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
- return ans*f;
- }
- int c[M][],fa[M],size[M],rev[M],lx[M],rx[M],sum[M];
- int n,m;
- bool isrt(int x){return c[fa[x]][]!=x&&c[fa[x]][]!=x;}
- void up(int x){size[x]=size[c[x][]]+size[c[x][]]+;}
- void down(int x){
- int l=c[x][],r=c[x][];
- if(rev[x]){
- if(l) swap(c[l][],c[l][]),rev[l]^=;
- if(r) swap(c[r][],c[r][]),rev[r]^=;
- rev[x]=;
- }
- int u=lx[x],v=rx[x];
- if(l) lx[l]=u,rx[l]=v;
- if(r) lx[r]=u,rx[r]=v;
- }
- void rotate(int x){
- int y=fa[x],z=fa[y],l=,r=;
- if(c[y][]==x) l=,r=;
- if(!isrt(y)) c[z][c[z][]==y]=x;
- fa[y]=x; fa[x]=z; fa[c[x][r]]=y;
- c[y][l]=c[x][r]; c[x][r]=y;
- up(y); up(x);
- }
- int st[M],top=,S;
- void splay(int x){
- st[++top]=x; for(int i=x;!isrt(i);i=fa[i]) st[++top]=fa[i];
- while(top) down(st[top--]);
- while(!isrt(x)){
- int y=fa[x],z=fa[y];
- if(!isrt(y)){
- if(c[z][]==y^c[y][]==x) rotate(x);
- else rotate(y);
- }
- rotate(x);
- }
- }
- void acs(int x0){
- for(int x=x0,y=;x;splay(x),c[x][]=y,up(x),y=x,x=fa[x]);
- splay(x0);
- }
- void mrt(int x){acs(x); swap(c[x][],c[x][]); rev[x]^=;}
- int find(int x){
- acs(x); while(c[x][]) x=c[x][];
- return x;
- }
- void push_link(int x,int y){mrt(x); fa[x]=y; acs(x);}
- void link(int x,int y){
- if(find(x)==find(y)) lx[y]=x,rx[y]=y;
- else push_link(x,y);
- }
- int push_ans(int x){
- acs(x); if(lx[x]&&rx[x]) return -;
- return size[x]-;
- }
- void cut(int x,int y){mrt(x); acs(y); c[y][]=fa[x]=; up(y); lx[x]=rx[x]=lx[y]=rx[y]=;}
- void push_cut(int x,int y){
- acs(x); int l=lx[x],r=rx[x];
- if(l==x&&r==y) lx[x]=rx[x]=;
- else{
- cut(x,y);
- if(l&&r) link(l,r);
- }
- }
- int main()
- {
- int k,x,w;
- n=read(); m=read(); S=n+;
- for(int i=;i<=S;i++) size[i]=;
- for(int i=;i<=n;i++){
- k=read(); sum[i]=k;
- if(i+k<=||i+k>n) push_link(i,S);
- else link(i,i+k);
- }
- for(int i=;i<=m;i++){
- k=read();
- if(k==) x=read(),mrt(S),printf("%d\n",push_ans(x));
- else{
- x=read(); w=read();
- if(x+sum[x]<=||x+sum[x]>n) cut(x,S);
- else push_cut(x,x+sum[x]);
- if(x+w<=||x+w>n) push_link(x,S);
- else link(x,x+w);
- sum[x]=w;
- }
- }
- return ;
- }
bzoj4764: 弹飞大爷 link-cut-tree的更多相关文章
- [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)
[BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ...
- 【LCT维护基环内向树森林】BZOJ4764 弹飞大爷
4764: 弹飞大爷 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 101 Solved: 52[Submit][Status][Discuss] ...
- BZOJ4764弹飞大爷——LCT
题目描述 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们 决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小伙伴的力量值, ...
- bzoj4764: 弹飞大爷
Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们 决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小 ...
- bzoj4764 弹飞大爷 LCT
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4764 题解 如果 \(a_i > 0\) 的话,那么就是 bzoj2002 的原题.直接 ...
- 【BZOJ4764】弹飞大爷 LCT
[BZOJ4764]弹飞大爷 Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们决定齐心合力构造一个下面这样的序列.这个序列 ...
- Link Cut Tree 总结
Link-Cut-Tree Tags:数据结构 ##更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1027479 一.概述 \(LCT\),动态树的一种,又可以 ...
- 【BZOJ2002】弹飞绵羊(Link-Cut Tree)
[BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...
- BZOJ 4764: 弹飞大爷
4764: 弹飞大爷 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 4 Solved: 4[Submit][Status][Discuss] Des ...
随机推荐
- Oralce 的sql问题
获取两个日期间的工作日, SQL> select dt_time 2 from (select to_date('01-12-2010 08:20:56','dd-mm-yyyy HH: ...
- 使用LinqToExcel和EPPlus操作excel
1.使用LinqToExcel LinqToExcel是一个.net framework平台下开源项目,它主要实现了LINQ的语法查询Excel电子表格.类型之前的LINQToXXX如果你是LINQ语 ...
- 一些可能有点用处的C#开发经验
前言: 下个月就要去进行Java开发了,以后C#碰的就少了(可惜去年买了三本C#的书,几乎还是全新的……),平时一些经验都记在OneNote里面,现在收集整理出来,因为只能利用交接工作的打酱油的时间, ...
- 汇编指令MOVSX与MOVZX
MOVSX 操作数A ,操作数B MOVZX 操作数A ,操作数B 相同点:操作数B 空间必须小于 操作数A 1.格式与MOV基本相同 2.能完成小存储单元向大存储单元的数据传送 比如 movsx e ...
- zabbix 2.2 调小监控值
zabbix_agent默认disk下小于0%告警 调小到5% 组态 > 模板 选择需要的模板的触发器 例如 Template OS Windows 选择触发器 - 探索规则 - 触发器类型 ...
- @property, @classmethod基本用法
@property 废话少说,贴上代码(代码参考@廖雪峰教程) class Student(object): def __init__(self, score): self._score = scor ...
- 可以完成99%的静态页面的HTML标签
HTML:一套浏览器认知的规则HTML分为两个部分,头和身体.一个完整的网页相当于一个裸体的人,我们利用HTML给它穿上衣服,使它更好看.下面我将为大家介绍一下HTML一些基本的标签,而这些基本的标签 ...
- 以太坊remix IDE安装步骤
Remix 以太坊Solidity IDE搭建与初步使用 以太坊: 因为以太坊为开源社区,虽然东西很优秀,但是组件十分的杂乱,因此首先简单介绍下以太坊的一些常用组件: Geth: Geth是由以太坊基 ...
- Hexo 博客部署到 GitHub
本文简单记录了一下把 Hexo 部署到 GitHub 上的过程,也是搭建静态博客最常用的一种方式. 前面写了关于如何把 Hexo 安装在树莓派上的教程,但树莓派毕竟是连着自己的家的路由器,万一哪天网断 ...
- C++STL——list
一.相关定义 list 链表,分配的内存不连续 可以高效地进行插入/删除元素 不可随机访问,访问速度慢 特征 只能通过迭代器来访问list中的元素 在头和尾都可以插入元素 二.list [前提条件] ...