“观蒟蒻,并帮忙”公益活动
  • 板块P5217 贫穷
  • 楼主George1123
  • 当前回复54
  • 已保存回复54
  • 发布时间2020/5/16 09:00
  • 上次更新2023/11/7 02:22:55
查看原帖
“观蒟蒻,并帮忙”公益活动
118365
George1123楼主2020/5/16 09:00
#include <bits/stdc++.h>
using namespace std;

//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x(a) a.first
#define y(a) a.second
#define b(a) a.begin()
#define e(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;

//Data
const int N=1e5,T=2e5;
int n,m,o[N+7],q[N+7],qcnt;
char s[N+7],c[3];
int bit(int x){return x?bit(x-(x&-x))+1:0;}

//Fhqtreap
int rt,cnt,sz[T+7],fa[T+7],ls[T+7],rs[T+7],v[T+7],sm[T+7],p[T+7],mk[T+7];
void up(int x){
	if(ls[x]) fa[ls[x]]=x;
	if(rs[x]) fa[rs[x]]=x;
	sz[x]=sz[ls[x]]+sz[rs[x]]+1;
	sm[x]=sm[ls[x]]|sm[rs[x]]|1<<v[x];
}
void down(int x){if(mk[x]) swap(ls[x],rs[x]),mk[ls[x]]^=1,mk[rs[x]]^=1,mk[x]=0;}
int wen(int x,int y=rand()){return v[++cnt]=x,p[cnt]=y,up(cnt),cnt;}
int merge(int x,int y){
	if(!x||!y) return x^y;
	if(p[x]<p[y]) return down(x),rs[x]=merge(rs[x],y),up(x),x;
	return down(y),ls[y]=merge(x,ls[y]),up(y),y;
}
void split(int u,int k,int&x,int&y){
	if(!u) return void(x=y=0);
	if(k<=sz[ls[u]]) down(u),y=u,split(ls[y],k,x,ls[y]),fa[x]=0,up(u);
	else down(u),x=u,split(rs[x],k-sz[ls[u]]-1,rs[x],y),fa[y]=0,up(u);
}
int frank(int x){
	qcnt=0;
	for(int i=x;i;i=fa[i]) q[++qcnt]=i;
	for(int i=qcnt;i>=1;i--) down(q[i]);
	int res=sz[ls[x]]+1;
	for(int i=x;fa[i];i=fa[i])if(rs[fa[i]]==i) res+=sz[ls[fa[i]]]+1;
	return res;
}
int kth(int x,int k){
	down(x); 
	while(k!=sz[ls[x]]+1)
		if(k<=sz[ls[x]]) down(x=ls[x]);
		else k-=sz[ls[x]]+1,down(x=rs[x]);
	return x;
}
void Print(int x){
	down(x);
	if(ls[x]) Print(ls[x]);
	printf("%c",v[x]+'a');
	if(rs[x]) Print(rs[x]);
}

//Main
int main(){
	scanf("%d%d\n%s",&n,&m,&s[1]);
	for(int i=1;i<=n;i++) rt=merge(rt,o[i]=wen(s[i]-'a'));
//	puts("now---");
//	Print(rt); puts("");
//	puts("++++++");
	for(int i=1,a,b,L,M,R;i<=m;i++){
		scanf("\n%s ",&c[1]);
		if(c[1]=='I'){
			scanf("%d %s\n",&a,&c[1]);
			split(rt,a,L,R);
			rt=merge(merge(L,wen(c[1]-'a')),R);
		} else if(c[1]=='D'){
			scanf("%d",&a);
			split(rt,a,L,R),split(L,a-1,L,M);
			v[M]=-1,rt=merge(merge(L,merge(ls[M],rs[M])),R);
		} else if(c[1]=='R'){
			scanf("%d%d",&a,&b);
			split(rt,b,L,R),split(L,a-1,L,M);
			mk[M]^=1,rt=merge(merge(L,M),R);
		} else if(c[1]=='P'){
			scanf("%d",&a);
			if(v[o[a]]==-1) puts("0");
			else printf("%d\n",frank(o[a]));
		} else if(c[1]=='T'){
			scanf("%d",&a);
			printf("%c\n",'a'+v[kth(rt,a)]);
		} else if(c[1]=='Q'){
			scanf("%d%d",&a,&b);
			split(rt,b,L,R),split(L,a-1,L,M);
			printf("%d\n",bit(sm[M])),rt=merge(merge(L,M),R);
		}
//		puts("now---");
//		Print(rt); puts("");
//		puts("++++++");
	}
	return 0;
}

萌新蒟蒻初学二叉树,WA 0  6{\color{red}\texttt{WA 0 分}}\ 6 次,求助。

2020/5/16 09:00
加载中...