什么鬼WA50
查看原帖
什么鬼WA50
142549
hbhz_zcy楼主2022/2/8 21:33

已验证,和空间大小无关。但是仍然WA50(后十个点). 使用动态主席树做的(大概指的是第一篇题解那种),整了一天...

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int N,M,a[maxn],ls[maxn],lstop=0,ftop=0,numf=0,root[maxn],st1[maxn],st2[maxn],stop1,stop2;
struct nodein{int a,b,c,d;}rd[maxn];
struct node{int v,l,r;}f[100*maxn<<3];
int lowbit(int t){return t&(-t);}
int qd(){
	int rt=0;char c=getchar();
	while(c<'0'||c>'9')  c=getchar();
	while('0'<=c&&c<='9')  rt=(rt<<3)+(rt<<1)+c-48,c=getchar();
	return rt;
}
void change(int &t,int l,int r,int p,int v){
	if(!t)  t=++numf;
//	printf("C %d %d %d %d %d\n",t,l,r,p,v);
	f[t].v+=v;
	if(l==r)  return;
	int m=(l+r)>>1;
	if(p<=m)  change(f[t].l,l,m,p,v);
	else  change(f[t].r,m+1,r,p,v);
}
void changep(int p,int v2){//p get his;k get val-pos to add v2
	int k=lower_bound(ls+1,ls+lstop+1,a[p])-ls;
//	printf("C %d %d %d\n",p,k,v2);
	for(;p<=N;p+=lowbit(p)){
//		printf("p=%d\n",p);
		change(root[p],1,lstop,k,v2);
	}
}//space:nlogn,t0==t
int ask(int l,int r,int p){
//	printf("A %d %d %d\n",l,r,p);
	if(l==r)  return l;
	int dt=0,m=(l+r)>>1;
	for(int i=1;i<=stop1;i++)  dt+=f[f[st1[i]].l].v;
	for(int i=1;i<=stop2;i++)  dt-=f[f[st2[i]].l].v;
	if(p<=dt){
		for(int i=1;i<=stop1;i++)  st1[i]=f[st1[i]].l;
		for(int i=1;i<=stop2;i++)  st2[i]=f[st2[i]].l;
		return ask(l,m,p);
	}
	else{
		for(int i=1;i<=stop1;i++)  st1[i]=f[st1[i]].r;
		for(int i=1;i<=stop2;i++)  st2[i]=f[st2[i]].r;
		return ask(m+1,r,p-dt);
	} 
}
int askp(int l,int r,int p){
	stop1=stop2=0;
	for(int i=r;i;i-=lowbit(i))  st1[++stop1]=root[i];
	for(int i=l-1;i;i-=lowbit(i))  st2[++stop2]=root[i];
	return ask(1,lstop,p);
}
int main(){
	N=qd(),M=qd();
	for(int i=1;i<=N;i++)  a[i]=ls[++lstop]=qd();
	for(int i=1;i<=M;i++){
		scanf(" %c",&rd[i].a);
//		printf("read c:%c c->d:%d\n",(char)rd[N+i].a,rd[N+i].a);
		if(rd[i].a=='Q')  rd[i].b=qd(),rd[i].c=qd(),rd[i].d=qd();
		else rd[i].b=qd(),rd[i].c=ls[++lstop]=qd();
	}
	sort(ls+1,ls+lstop+1);
	lstop=unique(ls+1,ls+lstop+1)-ls-1;
//	for(int i=1;i<=lstop;i++)  printf("%d ",ls[i]);
//	printf("\n");
	for(int i=1;i<=N;i++)  changep(i,1);
//		printf("T\n");
	for(int i=1;i<=M;i++){
		if(rd[i].a=='Q')  printf("%d\n",ls[askp(rd[i].b,rd[i].c,rd[i].d)]);
		else{
			changep(rd[i].b,-1);
			a[rd[i].b]=rd[i].c;
			changep(rd[i].b,1);
		}
	}
	return 0;
}
2022/2/8 21:33
加载中...