LCT 40pts 求调
查看原帖
LCT 40pts 求调
784175
Judging_zhu楼主2025/7/29 12:46
#include<bits/stdc++.h>
#define ls ch[p][0]
#define rs ch[p][1]
#define gget(x) (ch[f[x]][1]==x)
#define isrt(x) (ch[f[x]][0]!=x&&ch[f[x]][1]!=x)
using namespace std;
const int N=2e5+5;
int n,m,a[N],sz[N];
bool tag[N];
unsigned short f[N],ch[N][2];
void pushup(int p){sz[p]=sz[ls]+sz[rs]+1;}
void modify(int p){
	tag[p]^=1;
	swap(ls,rs);
}
void pushdown(int p){
	if(tag[p]){
		if(ls)modify(ls);
		if(rs)modify(rs);
		tag[p]=0;
	}
}
void update(int p){
	if(!isrt(p))update(f[p]);
	pushdown(p);
}
void rotate(int x){
	int y=f[x];
	int z=f[y];
	int k=gget(x),tmp=ch[x][!k];
	if(!isrt(y))ch[z][ch[z][1]==y]=x;
	ch[x][!k]=y,ch[y][k]=tmp;if(tmp)f[tmp]=y;
	f[y]=x,f[x]=z;
	pushup(y);pushup(x);
}
void splay(int x){
	update(x);
	for(int fa;fa=f[x],!isrt(x);rotate(x))
		if(!isrt(fa))
			rotate(gget(fa)==gget(x)?fa:x);
	pushup(x);
}
int access(int x){
	int p;
	for(p=0;x;p=x,x=f[x]){
		splay(x);
		ch[x][1]=p;
		pushup(x);
	}
	return p;
}
void makert(int p){
	access(p);
	splay(p);
	modify(p);
}
void link(int x,int p){
	makert(x);
	f[x]=p;
}
int split(int x,int y){
	makert(x);
	access(y);
	splay(y);
	return sz[y];
}
void cut(int x,int p){
	makert(x);access(p);splay(p);
	ch[p][0]=f[x]=0;
	pushup(p);
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
    for(int i=1;i<=n+1;i++)sz[i]=1;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        link(i,i+a[i]<=n?i+a[i]:n+1);
    }
    cin>>m;
    while(m--){
        int opt,j;
        cin>>opt>>j;j++;
        if(opt==1){
            cout<<split(j,n+1)-1<<"\n";
        }else{
            int k;cin>>k;
            int old=a[j];
            cut(j,j+old<=n?j+old:n+1);
            a[j]=k;
            link(j,j+k<=n?j+k:n+1);
        }
    }
    return 0;
}

提交记录

2025/7/29 12:46
加载中...