列表

详情


NC15504. VVQ 与线段

描述

VVQ 最近迷上了线段这种东西

现在他手上有 n 条线段,他希望在其中找到两条有公共点的线段,使得他们的异或值最大。 定义线段的异或值为它们并的长度减他们交的长度


输入描述

第一行包括一个正整数 n,表示 VVQ 拥有的线段条数。
接下来 n 行每行包括两个正整数 l,r,表示 VVQ 拥有的线段的 左右端点。

输出描述

一行一个整数,表示能得到的最大异或值

示例1

输入:

3 
10 100 
1 50 
50 100

输出:

99

说明:

选择第二条和第三条,99-0=99

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 223ms, 内存消耗: 7796K, 提交时间: 2022-09-01 14:52:16

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;

int n;ll ans;
struct node{
	ll l,r;
}I[maxn];
bool cmp(node a,node b)
{
	if(a.r==b.r) return a.l>b.l;
	return a.r>b.r;
}
struct cmp2{
	bool operator()(node a,node b)
	{
		return a.l+a.r<b.l+b.r;
	}
};
priority_queue<node,vector<node>,cmp2> p;

int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>I[i].l>>I[i].r;
	}
	sort(I,I+n,cmp);

	p.push(I[0]);
	for(int i=1;i<n;i++)
	{
		while(!p.empty()&&p.top().l>I[i].r)
			p.pop();
		if(!p.empty())
			ans=max(ans,p.top().r-I[i].r+abs(p.top().l-I[i].l));
		p.push(I[i]);
	}
	cout<<ans<<endl;
	return 0;
}

上一题