后7个点全MLE,不知道是什么原因
  • 板块P4879 ycz的妹子
  • 楼主isme1
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/19 08:43
  • 上次更新2024/8/19 11:13:31
查看原帖
后7个点全MLE,不知道是什么原因
912779
isme1楼主2024/8/19 08:43
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005],N=500000,cnt;
int sum[2000005],num[2000005],R[2000005];
int ls(int p){
	return p*2;
}
int rs(int p){
	return p*2+1;
}
void pushup(int p){
	R[p]=max(R[ls(p)],R[rs(p)]);
	sum[p]=sum[ls(p)]+sum[rs(p)];
	num[p]=num[ls(p)]+num[rs(p)];
}
void build(int p,int pl,int pr){
	if(pl==pr){
		num[p]+=(pl<=n);
		sum[p]=(pl<=n?a[pl]:0);
		R[p]=(pr<=n?pr:0);
		return;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	pushup(p);
}
void update1(int p,int x,int pl,int pr,int d){
	if(pl==pr&&pr==x){
		sum[p]-=d;
		return;
	}
	int mid=(pl+pr)>>1;
	if(x<=mid) update1(ls(p),x,pl,mid,d);
	else update1(rs(p),x,mid+1,pr,d);
	pushup(p);
}
void update2(int p,int pl,int pr,int x,int d){
	if(pl==pr&&pr==x){
		sum[p]=d;
		num[p]=1;
		return;
	}
	int mid=(pl+pr)>>1;
	if(x<=mid) update2(ls(p),pl,mid,x,d);
	else update2(rs(p),mid+1,pr,x,d);
	pushup(p);
}
void update3(int p,int pl,int pr,int x,int res){
	if(res==x){
		cnt=R[p];
		return;
	}
	int mid=(pl+pr)>>1;
	if(num[ls(p)]==x-res){
		cnt=R[ls(p)];
		return;
	}
	if(num[ls(p)]<x-res)  update3(rs(p),mid+1,pr,x,res+num[ls(p)]);
	else  update3(ls(p),pl,mid,x,res);
	return;
}
void update4(int p,int pl,int pr,int x){
	if(pl==pr&&pr==x){
		num[p]=0;
		sum[p]=0;
		R[p]=0;
		return;
	}
	int mid=(pl+pr)>>1;
	if(x<=mid) update4(ls(p),pl,mid,x);
	else update4(rs(p),mid+1,pr,x);
	pushup(p);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,N);
	for(int i=1;i<=m;i++){
		char op;
		int x,y;
		cin>>op;
		if(op=='C'){
			cin>>x>>y;
			update1(1,x,1,N,y);
		}
		else if(op=='I'){
			cin>>x>>y;
			update2(1,1,N,x,y);
		}
		else if(op=='D'){
			cin>>x;
			update3(1,1,N,x,0);
			update4(1,1,N,cnt);
		}
		else{
			cout<<sum[1]<<endl;
		}
	}
	return 0;
}
2024/8/19 08:43
加载中...