线段树为什么会TLE???
查看原帖
线段树为什么会TLE???
983702
lrj3247楼主2024/12/11 21:28

https://www.luogu.com.cn/record/194000429

#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int w=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while('0'<=ch&&ch<='9'){
		w=w*10+(ch-'0');
		ch=getchar();
	}
	return w*f;
}
void write(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
const int N=2e5+15;
struct Node{
	int l,r,lm,rm,mx,sum,tag;
	Node(){
		lm=rm=mx=sum=tag=0;
	}
};
int k;
struct SegmentTree{
	Node tr[N<<2];
	void build(int id,int l,int r){
		tr[id].l=l,tr[id].r=r;
		if(l==r) return ;
		int mid = l+r>>1;
		build(id<<1,l,mid);
		build(id<<1|1,mid+1,r);
		return ;
	}
	void pushdown(int id){
		if(!tr[id].tag) return ;
		int l = tr[id].l,r=tr[id].r,mid = l+r>>1;
		tr[id<<1].lm=mid-l+1,tr[id<<1].rm=mid-l+1,tr[id<<1].mx=mid-l+1,tr[id<<1].sum=mid-l+1,tr[id<<1].tag=1;
		tr[id<<1|1].lm=r-mid,tr[id<<1|1].rm=r-mid,tr[id<<1|1].mx=r-mid,tr[id<<1|1].sum=r-mid,tr[id<<1|1].tag=1;
		tr[id].tag=0;
		return ;
	}
	void update(Node &rt,Node &ls,Node &rs){
		rt.lm=ls.lm;
		if(ls.sum==ls.r-ls.l+1) rt.lm+=rs.lm;
		rt.rm=rs.rm;
		if(rs.sum==rs.r-rs.l+1) rt.rm+=ls.rm;
		rt.mx=max(ls.rm+rs.lm,max(ls.mx,rs.mx));//very important
		rt.sum=ls.sum+rs.sum;
		return ;
	}
	void change1(int id,int x,int y,int l,int r){
		if(x<=l&&r<=y){
			tr[id].tag=1;
			tr[id].lm=r-l+1,tr[id].rm=r-l+1,tr[id].mx=r-l+1,tr[id].sum=r-l+1;
			return ;
		}
		pushdown(id);
		int mid = l+r>>1;
		if(x<=mid) change1(id<<1,x,y,l,mid);
		if(y>mid) change1(id<<1|1,x,y,mid+1,r);
		update(tr[id],tr[id<<1],tr[id<<1|1]);
		return ;
	}
	void change2(int id,int x,int y,int l,int r){
		if(k==0) return ;
		if(x<=l&&r<=y&&k>=tr[id].sum){
			k-=tr[id].sum;
			tr[id].lm=tr[id].rm=tr[id].mx=tr[id].sum=0;
			tr[id].tag=0;
			return ;
		}
		pushdown(id);
		int mid=l+r>>1;
		if(k>0&&x<=mid) change2(id<<1,x,y,l,mid);
		if(k>0&&y>mid) change2(id<<1|1,x,y,mid+1,r);
		update(tr[id],tr[id<<1],tr[id<<1|1]);
		return ;
	}
	int query1(int id,int x,int y,int l,int r){
		if(x<=l&&r<=y){
			return tr[id].sum;
		}
		pushdown(id);
		int mid = l+r>>1,ans=0;
		if(x<=mid) ans+=query1(id<<1,x,y,l,mid);
		if(y>mid) ans+=query1(id<<1|1,x,y,mid+1,r);
		return ans;
	}
	Node query2(int id,int x,int y,int l,int r){
		if(x<=l&&r<=y){
			return tr[id];
		}
		Node ret;
		int mid = l + r >> 1;
		if(l<=mid&&mid<r){
			Node ls = query2(id<<1,x,y,l,mid),rs=query2(id<<1|1,x,y,mid+1,r);
			update(ret,ls,rs);
		}
		else if (l<=mid){
			return query2(id<<1,x,y,l,mid);
		}
		else if(r>mid){
			return query2(id<<1|1,x,y,mid+1,r);
		}
		return ret;
	}
}T;
int main(){
	int n = read() , m=read();
	T.build(1,1,n);
	for(int i = 1 ; i<=m ; i++){
		int op = read();
		if(op==0){
			int l = read() , r = read();
			T.change1(1,l,r,1,n);
		}
		if(op==1){
			int l0 = read() , r0 = read() , l1 = read() , r1 = read();
			int sum =  r0-l0+1 - T.query1(1,l0,r0,1,n);
			T.change1(1,l0,r0,1,n);
			k = sum ;
			T.change2(1,l1,r1,1,n);
			k = 0;
		}
		if(op==2){
			int l = read() , r = read() ;
			int ans = T.query2(1,l,r,1,n).mx;
			write(ans);
			putchar('\n');
		}
	}
	return 0;
}
2024/12/11 21:28
加载中...