求助此题
查看原帖
求助此题
120947
PurslaneM2GA楼主2024/1/4 12:17

RT。

我线段树开了四倍数组,RE。

然后开了八倍数组,AC。

Why?

这是代码,我觉得我写的没那么逆天啊??

#include<bits/stdc++.h>
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=2e5+10;
int n,m,mx[MAXN<<2];
multiset<int> st[MAXN<<2];
#define lson (k<<1)
#define rson (k<<1|1)
#define mid (l+r>>1)
int calc(int k) {
	if(st[k].size()==0) return -1;
	return *(--st[k].end());
}
void insert(int k,int l,int r,int x,int y,int v) {
	if(x<=l&&r<=y) return st[k].insert(v),mx[k]=max(mx[k],v),void();
	if(x<=mid) insert(lson,l,mid,x,y,v);
	if(y>mid) insert(rson,mid+1,r,x,y,v);
	mx[k]=max({mx[lson],mx[rson],calc(k)});
	return ;
}
void del(int k,int l,int r,int x,int y,int v) {
	if(mx[k]<v) return ;
	if(calc(k)==v) {
		st[k].erase(st[k].find(v));
		if(l<x) insert(k,l,r,l,x-1,v);
		if(y<r) insert(k,l,r,y+1,r,v);
		mx[k]=max({mx[lson],mx[rson],calc(k)});
		return ;	
	}
	if(x<=mid) del(lson,l,mid,x,y,v);
	if(y>mid) del(rson,mid+1,r,x,y,v);
	mx[k]=max({mx[lson],mx[rson],calc(k)});
	return ;
}
int query(int k,int l,int r,int x,int y) {
	int ans=calc(k);
	if(x<=l&&r<=y) return max(ans,mx[k]);
	if(y<=mid) return max(ans,query(lson,l,mid,x,y));
	if(x>mid) return max(ans,query(rson,mid+1,r,x,y));
	return max({ans,query(lson,l,mid,x,y),query(rson,mid+1,r,x,y)});
}
int main() {
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	memset(mx,-1,sizeof(mx));
	cin>>n>>m;
	ffor(i,1,m) {
		int op,l,r,v;
		cin>>op>>l>>r;
		if(op==1) cin>>v,insert(1,1,n,l,r,v);	
		if(op==3) {
			v=query(1,1,n,l,r);
			cout<<v<<'\n';
		}
		if(op==2) {
			v=query(1,1,n,l,r);
			if(v!=-1) del(1,1,n,l,r,v);	
		}
	}
	return 0;
}
2024/1/4 12:17
加载中...