30 求助
查看原帖
30 求助
120947
PurslaneTsing Wah楼主2021/12/11 11:38

RT, WA + TLE

#include<bits/stdc++.h>
using namespace std;
inline bool id(const char ch) {
	return ch>='0'&&ch<='9';
}
inline int read(void) {
	int s=0,f=0;
	char ch=getchar();
	while(!id(ch)) f=(ch=='-'),ch=getchar();
	while(id(ch)) s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return f?-s:s;
}
const int MAXN=200000+10;
struct Tree {
	int tag,sum,lmax,rmax,ans,l,r;	
}tr[MAXN<<2];
int n,m;
inline int ALL_EMPTY(const Tree A) {
	return A.r-A.l+1==A.sum;	
}
inline Tree merge(const Tree A,const Tree B) {
	return Tree{0,A.sum+B.sum,max(A.lmax,ALL_EMPTY(A)*(A.r-A.l+1+B.lmax)),max(B.rmax,ALL_EMPTY(B)*(B.r-B.l+1+A.rmax)),max(max(A.ans,B.ans),A.rmax+B.lmax),A.l,B.r};	
}
/*
tag: 1->empty all 2->fill all
*/
inline void push_down(const int k,const int l,const int r) {
	if(tr[k].tag==1) {
		int mid=l+r>>1;
		tr[k<<1]=Tree{1,mid-l+1,mid-l+1,mid-l+1,mid-l+1,l,mid},tr[k<<1|1]=Tree{1,r-mid,r-mid,r-mid,r-mid,mid+1,r};
		tr[k].tag=0;
		return;
	}
	if(tr[k].tag==2) {
		int mid=l+r>>1;
		tr[k<<1]=Tree{2,0,0,0,0,l,mid},tr[k<<1|1]=Tree{2,0,0,0,0,mid+1,r};
		tr[k].tag=0;
		return;	
	}
}
void update(const int k,const int l,const int r,const int x,const int y,const int val) {
	if(x<=l&&r<=y) {
		tr[k]=Tree{val,(2-val)*(r-l+1),(2-val)*(r-l+1),(2-val)*(r-l+1),(2-val)*(r-l+1),l,r};
		return;
	}
	push_down(k,l,r);
	int mid=l+r>>1;
	if(x<=mid) update(k<<1,l,mid,x,y,val);
	if(y>mid) update(k<<1|1,mid+1,r,x,y,val);
	tr[k]=merge(tr[k<<1],tr[k<<1|1]);
	return;
}
Tree query(const int k,const int l,const int r,const int x,const int y) {
	if(x<=l&&r<=y) return tr[k];
	push_down(k,l,r);
	int mid=l+r>>1;
	if(x<=mid&&y>mid) return merge(query(k<<1,l,mid,x,y),query(k<<1|1,mid+1,r,x,y));
	if(x<=mid) return query(k<<1,l,mid,x,y);
	return query(k<<1|1,mid+1,r,x,y);	
}
int sum(const int k,const int l,const int r,const int x,const int y) {
	if(x<=l&&r<=y) return tr[k].sum;
	push_down(k,l,r);
	int mid=l+r>>1,S=0;
	if(x<=mid) S+=sum(k<<1,l,mid,x,y);
	if(y>mid) S+=sum(k<<1|1,mid+1,r,x,y);
	return S;	
}
int bin_search(const int x,const int v) {
	int l=x,r=n,ans=r;
	while(l<=r) {
		int mid=l+r>>1;
		if(sum(1,1,n,x,mid)<=v) ans=mid,l=mid+1;
		else r=mid-1;
	}
	return ans;
}
int main() {
	n=read(),m=read();
	update(1,1,n,1,n,2);
	for(int i=1,op,l,r,L,R;i<=m;i++) {
		op=read(),l=read(),r=read();
		if(op==0) update(1,1,n,l,r,1);
		if(op==1) {int s=r-l+1-sum(1,1,n,l,r);update(1,1,n,l,r,1),L=read(),R=read(),update(1,1,n,L,min(R,bin_search(L,s)),2);}
		if(op==2) printf("%d\n",query(1,1,n,l,r).ans);
	}
	return 0;
}
2021/12/11 11:38
加载中...