【BZOJ4764】弹飞大爷
题解:
这个应该还是比较简单的
首先比较容易想到用lct来维护
我们可以建立一个特殊点
然后我们要处理环
其实只要判断它和不和这个特殊点联通就行了
那么当它不是环了我们怎么还原呢
只要对每个在根节点记录一下lazy标记 然后处理一下就好了
代码:
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x&(-x))
#define ll long long
#define IL inline
#define rint register int
#define me(x) memset(x,0,sizeof(x))
#define fi first
#define se second
#define mid ((h+t)>>1)
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define setit set<int>::iterator
const int INF=1e9;
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T> read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=c^;
while (c=gc(),<c&&c<) x=(x<<)+(x<<)+(c^);
x*=f;
}
const int N=6e5;
int fa[N],ls[N],rs[N],count2[N],p[N];
bool rev[N];
struct re{
int a,b;
}lazy[N];
IL void updata(int x)
{
count2[x]=count2[ls[x]]+count2[rs[x]]+;
}
IL bool pd(int x)
{
int fa1=fa[x];
if (ls[fa1]!=x&&rs[fa1]!=x) return();
else return();
}
IL void down(int x)
{
if (!rev[x]) return;
swap(ls[x],rs[x]);
rev[ls[x]]^=; rev[rs[x]]^=;
rev[x]=;
}
void rotate(int x,int y)
{
int fa1=fa[x];
if (y==)
{
rs[fa1]=ls[x];
if (ls[x]) fa[ls[x]]=fa1;
} else
{
ls[fa1]=rs[x];
if (rs[x]) fa[rs[x]]=fa1;
}
fa[x]=fa[fa1];
if (pd(fa1))
{
if (ls[fa[fa1]]==fa1) ls[fa[fa1]]=x; else rs[fa[fa1]]=x;
}
fa[fa1]=x;
if (y==) ls[x]=fa1; else rs[x]=fa1;
updata(fa1); updata(x);
}
void dfs(int x)
{
if (pd(x)) dfs(fa[x]);
down(x);
}
void splay(int x)
{
dfs(x);
int fa1=fa[x];
while (pd(x))
{
if (!pd(fa1))
{
if (x==ls[fa1]) rotate(x,); else rotate(x,);
} else
if (ls[fa[fa1]]==fa1)
if (ls[fa1]==x)
rotate(fa1,),rotate(x,);
else
rotate(x,),rotate(x,);
else
if (rs[fa1]==x)
rotate(fa1,),rotate(x,);
else
rotate(x,),rotate(x,);
fa1=fa[x];
}
}
void access(int x)
{
for (int y=;x;y=x,x=fa[x])
{
splay(x);
rs[x]=y,updata(x);
}
}
void mkr(int x)
{
access(x);
splay(x);
rev[x]^=;
}
int fdr(int x)
{
access(x);
splay(x);
while(ls[x]) x=ls[x];
return(x);
}
void split(int x,int y)
{
mkr(x);
access(y);
splay(y);
}
void link(int x,int y)
{
mkr(x);
if (fdr(y)!=x) fa[x]=y;
else
{
int x1=fdr(y);
lazy[x1].a=x,lazy[x1].b=y;
}
}
void cut(int x,int y)
{
int x1=fdr(x);
if ((lazy[x1].a==x&&lazy[x1].b==y)||(lazy[x1].a==y&&lazy[x1].b==x))
{
lazy[x1].a=lazy[x1].b=;
} else
{
int tmp1=lazy[x1].a,tmp2=lazy[x1].b;
lazy[x1].a=lazy[x1].b=;
mkr(x);
access(y);
splay(y);
fa[x]=ls[y]=;
updata(y);
if (tmp1!=)
{
link(tmp1,tmp2);
}
}
}
int n,m;
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
read(n); read(m);
int k;
rep(i,,n) count2[i]=;
rep(i,,n)
{
read(k);
p[i]=k;
if (i+k<=n&&i+k>=)
{
link(i,i+k);
} else link(i,n+);
}
rep(i,,m)
{
int x,y,z;
read(x); read(y);
if (x==)
{
access(y);
int x1=fdr(y);
if (lazy[x1].a) printf("%d\n",-);
else
{
split(n+,y);
printf("%d\n",count2[y]-);
}
} else
{
read(z);
if (y+p[y]<=n&&y+p[y]>=) cut(y,y+p[y]);
else cut(y,n+);
if (y+z<=n&&y+z>=) link(y,y+z);
else link(y,n+);
p[y]=z;
}
}
return ;
}
【BZOJ4764】弹飞大爷的更多相关文章
- 【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: 弹飞大爷 link-cut-tree
题目传送门 这道题啊 调了一个晚上 因为写的是一个有根树和n个基环的写法 所以写得很奇怪..... 最后发现单独处理树的时候不能随意改变S(就是原来的根)不然size会出错.... #include& ...
- 【BZOJ4764】弹飞大爷 LCT
[BZOJ4764]弹飞大爷 Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们决定齐心合力构造一个下面这样的序列.这个序列 ...
- BZOJ 4764: 弹飞大爷
4764: 弹飞大爷 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 4 Solved: 4[Submit][Status][Discuss] Des ...
- 【bzoj 4764】弹飞大爷
Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小伙 ...
- 【BZOJ】4764: 弹飞大爷 LCT
[题意]给定n个数字ai,表示大爷落到i处会被弹飞到i+ai处,弹飞到>n或<1处则落地.m次操作,修改一个ai,或询问大爷落到x处经过几次落地(或-1).n,m<=10^5,|ai ...
随机推荐
- 用UDP实现聊天功能
// SK003Dlg.cpp : implementation file // #include "stdafx.h" #include "SK003.h" ...
- P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?LCT?...FAQ orz
好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...
- oracle11g自动内存管理
Oracle一直不停的在为Orace数据库的自动化管理努力着,11G中的自动内存管理是Oracle数据库中又一新的里程碑,通过新参数MEMORY_TARGET 来代替PGA和SGA的配置,ORACLE ...
- FreeSWITCH异常原因总结
最经在玩FreeSWITCH的时候,遇到很多的问题,特此总结一下,希望以后不要犯类似的错误了: 1.Client端无法注册,但是FS运行正常? 解决办法:查看防火墙是否关闭./etc/init.d/i ...
- Django请求周期图
- 【原创】大数据基础之Flume(2)Sink代码解析
flume sink核心类结构 1 核心接口Sink org.apache.flume.Sink /** * <p>Requests the sink to attempt to cons ...
- [MySQL]join的细节
left join,左表返回所有记录,右表只返回跟左表有关联的记录,当右表有N条记录跟左表的某一条记录A关联,那么查询结果会出现N条A记录(相应关联右表的N条记录) right join,右表返回所有 ...
- LuoGu P1352 没有上司的舞会
题目传送门 这可能是最简单的树形Dp了吧 对于每个人,要么他来,他的下属不来 要么他不来,他的下属爱来不来 于是设计状态: f[i][0/1]表示以i为根的子树中最大能达到的快乐值(i这个人选或者不选 ...
- swift 学习- 24 -- 协议 01
// 协议 定义了一个蓝图, 规定了用来实现某一特定任务或者功能的方法, 属性, 以及其他需要的东西. // 类, 结构体, 或 枚举都可以遵循协议, 并且为协议定义的这些要求 提供具体的实现, 某个 ...
- python 面向对象编程(高级篇)
飞机票 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对 ...