ARC D 求调
查看原帖
ARC D 求调
320423
s4CRIF1CbUbbL3AtIAly楼主2023/4/8 22:01

rt,一直一车 wa 和 re。

思路是直接将之前的线段分为两类,分开处理

#include<bits/stdc++.h>
using namespace std;
const int MX=1e9;
int n;
int l[200005];
int r[200005];
//left side:v[j] +r[i]-l[i]
//right side:v[j]-r[j] +r[i]
#define mid (l+r>>1)
#define inf 0x3f3f3f3f
struct node{
	int ls,rs;
	int mx1,mx2;//1:v[i] 2:v[i]-r[i]
}a[2000005];
#define up(x) a[x].mx1=max(a[a[x].ls].mx1,a[a[x].rs].mx1),a[x].mx2=max(a[a[x].ls].mx2,a[a[x].rs].mx2)
int cnt,rt;
void add(int &p,int l,int r,int x,int v1,int v2){
	if(!p) p=++cnt,a[p]={0,0,-inf,-inf};
	if(l==r){
		a[p]={0,0,v1,v2};
		return;
	}
	if(x<=mid) add(a[p].ls,l,mid,x,v1,v2);
	else add(a[p].rs,mid+1,r,x,v1,v2);
	up(p);
}
int query(int &p,int l,int r,int L,int R,int tp){
	if(L>R) return -inf;
	if(!p) return -inf;
	if(l>=L&&r<=R) return tp==1?a[p].mx1:a[p].mx2;
	int mx=-inf;
	if(L<=mid) mx=max(mx,query(a[p].ls,l,mid,L,R,tp));
	if(R>mid) mx=max(mx,query(a[p].rs,mid+1,r,L,R,tp));
	return mx;
}
int main(){
	cin>>n;int ans=0;
	for(int i=1;i<=n;i++){
		cin>>l[i]>>r[i];
		int v1=query(rt,1,MX,1,l[i]-1,1),v2=query(rt,1,MX,l[i],r[i]-1,2);
		if(v1<=0) v1=0;
		v1+=r[i]-l[i]+1;
		if(v2==-inf) v2=0;
		else v2+=r[i];
		int v=max(v1,v2);
		//cout<<v<<endl;
		//v=max(v,r[i]-l[i]+1);
		ans=max(ans,v);
		add(rt,1,MX,r[i],v,v-r[i]);
		// cout<<i<<":"<<v1<<" "<<v2<<" "<<ans<<endl;
	}
	cout<<ans<<endl;
	return 0;
}
2023/4/8 22:01
加载中...