WA 两个点求调
查看原帖
WA 两个点求调
581316
small_john楼主2024/7/1 15:08

rt,代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5,M = 6e5+5;
int n,lt[N],rt[N],b[M],cnt;
#define get(x) (lower_bound(b+1,b+cnt+1,x)-b)
struct node{
	int mx,p,tag;
	inline friend node operator + (node x,node y)
	{
		node res;
		if(x.mx>=y.mx) res = x;
		else res = y;
		res.tag = 0;
		return res; 
	}
}t[M<<2];
#define ls (k<<1)
#define rs (k<<1|1)
#define pushup(k) (t[k] = t[ls]+t[rs])
#define add(k,v) (t[k].mx+=v,t[k].tag+=v,void())
inline void down(int k)
{
	if(t[k].tag)
	{
		add(ls,t[k].tag),add(rs,t[k].tag);
		t[k].tag = 0;
	}
}
void build(int k,int l,int r)
{
	if(l==r) return t[k].p = l,void();
	int mid = (l+r)/2;
	build(ls,l,mid),build(rs,mid+1,r);
	pushup(k);
}
void change(int k,int l,int r,int x,int y,int v)
{
	if(l>y||r<x) return;
	if(l>=x&&r<=y) return add(k,v);
	int mid = (l+r)/2;
	down(k);
	change(ls,l,mid,x,y,v),change(rs,mid+1,r,x,y,v);
	pushup(k);
}
node ask(int k,int l,int r,int x,int y)
{
	if(l>y||r<x) return (node){-1,-1,0};
	if(l>=x&&r<=y) return t[k];
	int mid = (l+r)/2;
	down(k);
	return ask(ls,l,mid,x,y)+ask(rs,mid+1,r,x,y);
}
vector<int> v[M];
int c[M];
signed main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i = 1;i<=n;i++)
		cin>>lt[i]>>rt[i],b[++cnt] = lt[i],b[++cnt] = max(0,lt[i]-1),b[++cnt] = lt[i]+1,b[++cnt] = rt[i],b[++cnt] = min(rt[i]+1,1000000000),b[++cnt] = rt[i]-1;
	b[++cnt] = 0,b[++cnt] = 1e9;
	sort(b+1,b+cnt+1),cnt = unique(b+1,b+cnt+1)-b-1;
	build(1,1,cnt);
//	cout<<get(4)<<'\n';
	for(int i = 1;i<=n;i++)
	{
		lt[i] = get(lt[i]),rt[i] = get(rt[i]);
//		cout<<lt[i]<<' '<<rt[i]<<'\n';
		v[lt[i]].push_back(rt[i]),c[rt[i]]++;
		change(1,1,cnt,lt[i]+1,rt[i]-1,1);
	}
	node res = ask(1,1,cnt,2,cnt);
	int ans = res.mx,ansl = 1,ansr = res.p;
	for(int i = 2;i<cnt;i++)
	{
		for(auto j:v[i-1]) change(1,1,cnt,j+1,cnt,1);
		for(auto j:v[i]) change(1,1,cnt,i+1,j-1,-1);
		change(1,1,cnt,i+1,cnt,-c[i]);
		res = ask(1,1,cnt,i+1,cnt);
		if(res.mx>ans) ans = res.mx,ansl = i,ansr = res.p;
	}
	if(ans==0)
	{
		cout<<"0 1";
		return 0;
	}
	cout<<b[ansl]<<' '<<b[ansr];
	return 0;
}
2024/7/1 15:08
加载中...