CF测评机出现灵异事件!
查看原帖
CF测评机出现灵异事件!
285617
黑影洞人楼主2022/11/15 18:36

一开始MLE,还以为是数组开大了,后来越来越不对劲

第一个点数组开1000都MLE,谁能解答

#include<cstdio>
#include<algorithm>
#include<set>
#define lc p<<1
#define rc p<<1|1
#define ct Chtholly_tree
#define Chtholly set<ct>::iterator
#define int long long
#define N 1000
using namespace std;
int n,q,col[N];
struct Segment_tree{
	int val,tag;
}s[N];
void pushup(int p){s[p].val=s[lc].val+s[rc].val;}
void pushdown(int p,int l,int r){
	if(!s[p].tag)return;
	int mid=(l+r)/2;
	s[lc].val+=(mid-l+1)*s[p].tag;
	s[rc].val+=(r-mid)*s[p].tag;
	s[lc].tag+=s[p].tag;
	s[rc].tag+=s[p].tag;
	s[p].tag=0;
}
void change(int p,int sl,int sr,int l,int r,int v){
	if(sl>r||sr<l)return;
	if(sl>=l&&sr<=r){
		s[p].val+=v*(sr-sl+1);
		s[p].tag+=v;
		return;
	}
	pushdown(p,sl,sr);
	int mid=(sl+sr)/2;
	change(lc,sl,mid,l,r,v);change(rc,mid+1,sr,l,r,v);
	pushup(p);
}
int query(int p,int sl,int sr,int x){
	if(sl>x||sr<x)return 0;
	if(sl==x&&sr==x)return s[p].val;
	pushdown(p,sl,sr);
	int mid=(sl+sr)/2;
	return query(lc,sl,mid,x)+query(rc,mid+1,sr,x);
}
struct Chtholly_tree{
	int l,r;
	mutable int val;
	ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;}
	bool operator<(const ct &c)const{return l<c.l;}
};
set<ct>st;
Chtholly split(int p){
	Chtholly it=st.lower_bound(ct(p,0,0));
	if(it!=st.end()&&it->l==p)return it;
	it--;ct tmp=*it;st.erase(it);
	st.insert(ct(tmp.l,p-1,tmp.val));
	return st.insert(ct(p,tmp.r,tmp.val)).first;
}
void assign(int l,int r,int v){
	Chtholly right=split(r+1),left=split(l);
	st.erase(left,right);
	st.insert(ct(l,r,v));
}
void assign_ans(int l,int r,int v){
	Chtholly right=split(r+1),left=split(l),it=left;
	for(;it!=right;it++)change(1,1,n,it->l,it->r,col[it->val]-col[v]);
	st.erase(left,right);
	st.insert(ct(l,r,v));
}
int query_ans(int x){
	Chtholly right=split(x+1),left=split(x);
	int ps=left->val;
	assign(left->l,right->r,ps);
	return query(1,1,n,x)+col[ps];
}
signed main(){
	scanf("%lld%lld",&n,&q);
	st.insert({1,n+1,1});
	while(q--){
		char s[10];
		int l,r,c;
		scanf("%s",s);
		if(s[0]=='C'){
			scanf("%lld%lld%lld",&l,&r,&c);
			assign_ans(l,r,c);
		}else if(s[0]=='A'){
			scanf("%lld%lld",&c,&l);
			col[c]+=l;
		}else{
			scanf("%lld",&l);
			printf("%lld\n",query_ans(l));
		}
	}
	return 0;
}



2022/11/15 18:36
加载中...