除Hack全过,MLE求助
查看原帖
除Hack全过,MLE求助
709361
盐焗蛋楼主2024/4/28 21:30

rt。

算了一下空间也没有MLE的道理,想着需不需要动态开点?

#include <bits/stdc++.h>
using namespace std;
struct sgt{
	int l,r;
	bool hv,lzhv;
}t[32][4*100000+2];
int n,m,q,l,r,x,ans;
char ch;
void build(int p,int l,int r){
	int ls,rs,mid;
	ls=p<<1,rs=p<<1|1,mid=0;
	for(int i=1;i<=m;i++) t[i][p].l=l,t[i][p].r=r;
	if(l==r){
		t[1][p].hv=1;
		return ;
	}
	mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	t[1][p].hv=t[1][ls].hv||t[1][rs].hv;
}
void pushdown(int k,int p){
	int ls,rs;
	ls=p<<1,rs=p<<1|1;
	if(t[k][p].lzhv){
		t[k][ls].lzhv=1;
		t[k][ls].hv=t[k][p].hv;
		t[k][rs].lzhv=1;
		t[k][rs].hv=t[k][p].hv;
		t[k][p].lzhv=0;
	}
}
void paint(int k,int p,int fl,int fr,bool cs){
	int ls,rs,mid;
	ls=p<<1,rs=p<<1|1,mid=0;
	if(t[k][p].l>=fl&&t[k][p].r<=fr){
		t[k][p].hv=cs;
		t[k][p].lzhv=1;
		return ;
	}
	pushdown(k,p);
	mid=(t[k][p].l+t[k][p].r)>>1;
	if(fl<=mid) paint(k,ls,fl,fr,cs);
	if(fr>mid) paint(k,rs,fl,fr,cs);
	t[k][p].hv=t[k][ls].hv||t[k][rs].hv;
}
bool query(int k,int p,int fl,int fr){
	int ls,rs,mid;
	bool sum;
	ls=p<<1,rs=p<<1|1,mid=0;sum=0;
	if(t[k][p].l>=fl&&t[k][p].r<=fr) return t[k][p].hv;
	pushdown(k,p);
	mid=(t[k][p].l+t[k][p].r)>>1;
	if(fl<=mid) sum|=query(k,ls,fl,fr);
	if(fr>mid) sum|=query(k,rs,fl,fr);
	t[k][p].hv=t[k][ls].hv||t[k][rs].hv;
	return sum;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	//LL!
	cin>>n>>m>>q;
	build(1,1,n);
/*	for(int i=1;i<=m;i++){
		cout<<i<<":\n";
		for(int j=1;j<=n;j++)
			cout<<query(i,1,j,j)<<"\n";
	}
	cout<<"\n\n";*/
	while(q--){
		cin>>ch;
		if(ch=='C'){
			cin>>l>>r>>x;
			if(l>r) swap(l,r);
			for(int i=1;i<=m;i++) paint(i,1,l,r,0);
			paint(x,1,l,r,1);
		}
		if(ch=='P'){
			cin>>l>>r;
			if(l>r) swap(l,r);
			ans=0;
			for(int i=1;i<=m;i++)
				ans+=query(i,1,l,r);
			cout<<ans<<"\n";
		}
/*		for(int i=1;i<=m;i++){
			cout<<i<<":\n";
			for(int j=1;j<=n;j++)
				cout<<query(i,1,j,j)<<"\n";
		}
		cout<<"\n\n";*/
	}
	return 0;
}
2024/4/28 21:30
加载中...