100pts,始终卡在特殊样例,求调
查看原帖
100pts,始终卡在特殊样例,求调
690160
ask_silently楼主2023/9/4 15:50

思路肯定没问题,卡在特殊样例了

#include <bits/stdc++.h>
using namespace std;

const int N=1e6+500;

int n,m,bsz,bcnt;
int bl[N],br[N],cnt[N],bel[N];

bool cun[N];

long long a[N],sum[N];

inline int read(){
	int t=0,f=1;
	register char c=getchar();
	while (c<48||c>57) f=(c=='-')?(-1):(f),c=getchar();
	while (c>=48&&c<=57)t=(t<<1)+(t<<3)+(c^48),c=getchar();
	return f*t;
}

inline long long readl(){
	long long t=0,f=1;
	register char c=getchar();
	while (c<48||c>57) f=(c=='-')?(-1):(f),c=getchar();
	while (c>=48&&c<=57)t=(t<<1)+(t<<3)+(c^48),c=getchar();
	return f*t;
}

void init(){
	bsz=sqrt(n+m+1000),bcnt=ceil((double)(n+m+1000)/bsz);
	for(long long i=1;i<=bcnt;i++){
		bl[i]=(i-1)*bsz+1,br[i]=i*bsz;
		for(long long j=bl[i];j<=br[i];j++){
			if(cun[j]) cnt[i]++;
			sum[i]+=a[j];
			bel[j]=i;
//			cout<<"i:"<<i<<" sum[i]:"<<sum[i]<<"\n";
		}
	}
}

long long qiuhe(){
	long long ans=0;
	for(long long i=1;i<=bcnt;i++) ans+=sum[i];
	return ans;
}

void jian(long long x,long long y){
	if(!cun[x]) return;
	sum[bel[x]]-=a[x];
	a[x]-=y;
	sum[bel[x]]+=a[x];
}

void jia(long long x,long long y){
	if(!cun[x]) cnt[bel[x]]++,cun[x]=true;
	sum[bel[x]]-=a[x];
	a[x]=y;
	sum[bel[x]]+=a[x];
}

void fen(long long x){
	long long res=0,d;
	for(long long i=1;i<=bcnt;i++){
		res+=cnt[i];
		if(res>=x) {d=i,res-=cnt[i];break;}
	}
	for(long long i=bl[d];i<=br[d];i++){
		if(cun[i]){
			res++;
			if(res==x){
				cun[i]=false;
				cnt[d]--;
				sum[d]-=a[i];
				a[i]=0;
				return;
			}
		}
	}
}

int main(){
	n=read(),m=read();
	for(long long i=1;i<=n;i++) a[i]=readl(),cun[i]=true;
	init();
	while(m--){
		char fu;
		cin>>fu;
		if(fu=='Q') printf("%lld\n",qiuhe());
		else if(fu=='C'){
			long long x=readl(),y=readl();
			jian(x,y);
		}else if(fu=='I'){
			long long x=readl(),y=readl();
			jia(x,y);
		}else{
			long long x=readl();
			fen(x);
		}
	}
	return 0;
}
2023/9/4 15:50
加载中...