悬3关,MnZn刚学线段树0.01秒求助
查看原帖
悬3关,MnZn刚学线段树0.01秒求助
1270894
_O_w_O_楼主2024/5/15 22:25

rt,样例2都过不了

#include<bits/stdc++.h>
using namespace std;
#define lid id<<1
#define rid id<<1|1
#define mid ((tr[id].l+tr[id].r)>>1)

const int N=2e5+5;
struct node{
	int l,r;
	int sum;
	int mx1,mx2;
	int tag1,tag2,tag3,tag4;
}tr[N<<2];
int n,m;
int op,l,r,k;

void pushup(int id){
	tr[id].sum=tr[lid].sum+tr[rid].sum;
	tr[id].mx1=max(tr[lid].mx1,tr[rid].mx1);
	tr[id].mx2=max(tr[lid].mx2,tr[rid].mx2);
}

void pushdown(int id){
	if(tr[id].tag1!=-1){
		tr[lid].tag3=tr[rid].tag3=0;
		tr[lid].tag1=tr[rid].tag1=tr[id].tag1;
		tr[lid].mx1=tr[rid].mx1=tr[id].tag1;
		tr[id].tag1=-1;
	}
	if(tr[id].tag2!=-1){
		tr[lid].tag4=tr[rid].tag4=0;
		tr[lid].tag2=tr[rid].tag2=tr[id].tag2;
		tr[lid].mx2=tr[rid].mx2=tr[id].tag2;
		tr[id].tag1=-1;
	}
	if(tr[id].tag3){
		tr[lid].tag3+=tr[id].tag3;
		tr[rid].tag3+=tr[id].tag3;
		tr[lid].mx1+=tr[id].tag3;
		tr[rid].mx1+=tr[id].tag3;
		tr[id].tag3=0;
	}
	if(tr[id].tag4){
		tr[lid].tag4+=tr[id].tag4;
		tr[rid].tag4+=tr[id].tag4;
		tr[lid].mx2+=tr[id].tag4;
		tr[rid].mx2+=tr[id].tag4;
		tr[id].tag4=0;
	}
}

void build(int id,int l,int r){
	tr[id].l=l,tr[id].r=r;
	tr[id].tag1=tr[id].tag2=-1;
	if(l==r){
		tr[id].sum=1;
		return;
	}
	build(lid,l,mid),build(rid,mid+1,r);
	pushup(id);
}

void change1(int id,int l,int r,int x){
	if(r<l) return;
	if(l==tr[id].l&&r==tr[id].r){
		tr[id].tag3=0;
		tr[id].tag1=tr[id].mx1=x;
		return;
	}
	pushdown(id);
	if(r<=mid) change1(lid,l,r,x);
	else if(l>mid) change1(rid,l,r,x);
	else change1(lid,l,mid,x),change1(rid,mid+1,r,x);
	pushup(id);
}

void change2(int id,int l,int r,int x){
	if(r<l) return;
	if(l==tr[id].l&&r==tr[id].r){
		tr[id].tag4=0;
		tr[id].tag2=tr[id].mx2=x;
		return;
	}
	pushdown(id);
	if(r<=mid) change2(lid,l,r,x);
	else if(l>mid) change2(rid,l,r,x);
	else change2(lid,l,mid,x),change2(rid,mid+1,r,x);
	pushup(id);
}

void add1(int id,int l,int r,int x){
	if(r<l) return;
	if(l==tr[id].l&&r==tr[id].r){
		tr[id].tag3+=x;
		tr[id].mx1+=x;
		return;
	}
	pushdown(id);
	if(r<=mid) add1(lid,l,r,x);
	else if(l>mid) add1(rid,l,r,x);
	else add1(lid,l,mid,x),add1(rid,mid+1,r,x);
	pushup(id);
}

void add2(int id,int l,int r,int x){
	if(r<l) return;
	if(l==tr[id].l&&r==tr[id].r){
		tr[id].tag4+=x;
		tr[id].mx2+=x;
		return;
	}
	pushdown(id);
	if(r<=mid) add2(lid,l,r,x);
	else if(l>mid) add2(rid,l,r,x);
	else add2(lid,l,mid,x),add2(rid,mid+1,r,x);
	pushup(id);
}

void del(int id,int l,int r,int x){
//	cout<<l<<' '<<r<<' '<<tr[id].mx1<<' '<<tr[id].mx2<<endl;
	if(max(tr[id].mx1,tr[id].mx2)<x||!tr[id].sum) return;
	if(tr[id].l==tr[id].r){
		tr[id].sum=0;
		cout<<l<<endl;
		return;
	}
	pushdown(id);
	if(r<=mid) del(lid,l,r,x);
	else if(l>mid) del(rid,l,r,x);
	else del(lid,l,mid,x),del(rid,mid+1,r,x);
	pushup(id);
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	cin>>n>>m;
	build(1,1,n);
	while(m--){
		cin>>op;
		if(op==1){
			cin>>l>>r>>k;
			change1(1,1,l-1,0);
			change2(1,l,r,0);
			change1(1,r+1,n,0);
			add2(1,1,l-1,k);
			add1(1,l,r,k);
			add2(1,r+1,n,k);
		}
		if(op==2){
			cin>>l>>r>>k;
			del(1,l,r,k);
		}
		if(op==3){
			cout<<tr[1].sum<<endl;
		}
	}
	return 0;
}
2024/5/15 22:25
加载中...