分块30pts既WA又T 求调
  • 板块P4879 ycz的妹子
  • 楼主A350_ti
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/11/11 19:34
  • 上次更新2023/10/27 03:22:54
查看原帖
分块30pts既WA又T 求调
169764
A350_ti楼主2022/11/11 19:34

求调

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,sum,a[500100],q,k[500100],fk,km[500100],v[500100];
signed main(){
	scanf("%lld%lld",&n,&q);fk=sqrt(n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		k[i]=(i-1)/fk+1;
		sum+=a[i];
		v[i]=1;
		km[k[i]]++;
	}
	while(q--){
		char t;
		int x,y;
		cin>>t;
		if(t=='Q'){
			cout<<sum<<endl;
		}else if(t=='C'){
			scanf("%lld%lld",&x,&y);
			if(v[x]){
				a[x]-=y;
				sum-=y;
			}
		}else if(t=='I'){
			scanf("%lld%lld",&x,&y);
			if(!v[x]){
				km[k[x]]++;
				v[x]=1;
			}
			sum+=(y-a[x]);
			a[x]=y;
		}else{
			scanf("%lld",&x);
			y=1;
			while(x>km[y]){
				x-=km[y];
				y++;
			}
			for(int i=(y-1)*fk+1;i<=min(n,y*fk);i++){
				if(v[i]){
					if(x==1){
						sum-=a[i];
						km[k[i]]--;
						v[i]=0;
						a[i]=0;
						break;
					}else{
						x--;
					}
				}
			}
		}
	}
	return 0;
}
2022/11/11 19:34
加载中...