冷静分析:
一个那种东西怎么会被使用?
对于大于s的最多次次被选贡献为s
小余的贡献为本来的权值。
辣么怎么办?
两个树状数组分别维护这两个值就好了(一个是值的个数,一个是值的和)
#includeusing namespace std;typedef int INT;#define int long long const int N=2e6+100;const int maxn=2e6+1;inline void read(int &x){ x=0; int f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } x*=f;}struct BIT{ int T[N]; BIT(){ memset(T,0,sizeof(T)); } inline int lowbit(int x){ return x&(-x); } void update(int x,int val){ if(x==0) return; while(x<=maxn){ T[x]+=val; x+=lowbit(x); } } int query(int x){ int ret=0; while(x){ ret+=T[x]; x-=lowbit(x); } return ret; }}A,B;int n,m;int sum[N]={};int mmp[N]={};int cnt=0;struct Query{ int c,x,y;}Q[N]; INT main(){// freopen("3471.in","r",stdin); read(n); read(m); for(int i=1;i<=m;i++){ char opt[3]; scanf("%s",opt); if(opt[0]=='U'){ Q[i].c=1; read(Q[i].x); read(Q[i].y); cnt++; mmp[cnt]=Q[i].y; } else{ Q[i].c=2; read(Q[i].x); read(Q[i].y); cnt++; mmp[cnt]=Q[i].y; } } sort(mmp+1,mmp+1+cnt); cnt=unique(mmp+1,mmp+1+cnt)-mmp-1; for(int i=1;i<=m;i++){ if(Q[i].c==1){ int k,a;// cout<<"in"; k=Q[i].x; a=Q[i].y; a=lower_bound(mmp+1,mmp+1+cnt,a)-mmp; A.update(sum[k],-mmp[sum[k]]); A.update(a,mmp[a]);// cout<<"here"<<'\n'; B.update(sum[k],-1); B.update(a,1); sum[k]=a; } else{ int c=Q[i].x; int s=Q[i].y; s=lower_bound(mmp+1,mmp+1+cnt,s)-mmp; int ans=A.query(s-1); ans+=(B.query(maxn)-B.query(s-1))*mmp[s]; //cout<<"ans= "< <<" "; if(ans