NC15504. VVQ 与线段
描述
VVQ 最近迷上了线段这种东西
现在他手上有 n 条线段,他希望在其中找到两条有公共点的线段,使得他们的异或值最大。 定义线段的异或值为它们并的长度减他们交的长度
输入描述
第一行包括一个正整数 n,表示 VVQ 拥有的线段条数。
接下来 n 行每行包括两个正整数 l,r,表示 VVQ 拥有的线段的 左右端点。
输出描述
一行一个整数,表示能得到的最大异或值
示例1
输入:
3 10 100 1 50 50 100
输出:
99
说明:
选择第二条和第三条,99-0=99C++(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; }