Wannafly挑战赛13 E VVQ 与线段

9人阅读 评论(0) 收藏 举报
分类:
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述 

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

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


输入描述:

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

输出描述:

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

输入

3 
10 100 
1 50 
50 100

输出

99

说明

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

备注:

1<=n<=200000,1<=l<=r<=1e8
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;

const int maxn=1e6+7;
pair<int,int> a[maxn];

/**

将线段端点存入pair,利用其自带排序函数对位置进行排序;
因此,只需讨论相交和包含两种情况(相离舍去);

线段a内部包含线段b 贡献:(a.r-a.l)-(b.r-b.l);
线段a与线段b相交   贡献:(a.r+b.l-b.l-b.r);

Q1: 包含贡献(大);
Q2: 相交贡献(小);
优先队列当前状态与右边(a[i])当前状态信息进行暴力模拟;
*/
struct node1{
	int l,r;
	node1(int x,int y){l=x;r=y;}
	friend bool operator <(node1 a,node1 b){return (a.r-a.l)<(b.r-b.l);}
};
struct node2{
	int l,r;
	node2(int a,int b){l=a;r=b;}
	friend bool operator <(node2 a,node2 b){return a.l+a.r>b.l+b.r;}
};
/**
bool operator <()(node1 a,node1 b){return a.r-a.l<b.r-b.l;}
bool operator <()(node2 a,node2 b){return a.l+a.r>b.l+b.r;}
*/

int main (){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d %d",&a[i].fi,&a[i].se);
	sort(a,a+n);
	priority_queue <node1>Q1;
	priority_queue <node2>Q2;
	Q1.push(node1(a[0].fi,a[0].se));
	Q2.push(node2(a[0].fi,a[0].se));
	int ans=0;
	for(int i=1;i<n;i++){
		while(!Q1.empty()&&Q1.top().r<a[i].se) Q1.pop();
		while(!Q2.empty()&&Q2.top().r<a[i].fi) Q2.pop();
		if(!Q1.empty()) ans=max(ans,Q1.top().r-Q1.top().l-a[i].se+a[i].fi);
		if(!Q2.empty()) ans=max(ans,a[i].fi+a[i].se-Q2.top().l-Q2.top().r);
		Q1.push(node1(a[i].fi,a[i].se));
		Q2.push(node2(a[i].fi,a[i].se));
  	}
  	cout<<ans<<endl;
	return 0;
}

查看评论

HDU 2176 取(m堆)石子游戏(尼姆博弈输出路径)

取(m堆)石子游戏Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su...
  • albertluf
  • albertluf
  • 2018-04-10 23:38:54
  • 74

Wannafly挑战赛13-比赛总结与部分题解

题目链接:点击打开链接A:题意很清晰了,就是让你打表,问你一共多少字符串看起来一样,把每一位的情况数乘起来就可以了注意取模方式:#include&amp;lt;bits/stdc++.h&amp;gt...
  • Cutec_lbq
  • Cutec_lbq
  • 2018-04-07 00:22:46
  • 42

Wannafly挑战赛1B-(二分)

题解:把所有区间的异或和都求出来并且吧右端点放入数组中,最后枚举每个区间二分查找前面有几个右端点的区间小于该区间的左端点,最后答案就是该总和。 #include #include #incl...
  • a1325136367
  • a1325136367
  • 2017-10-13 23:18:57
  • 186

牛客网Wannafly挑战赛9总结

第一次打这个还带分的比赛,有点小激动...还被告知有些难度。   刚开始a题暴力错了,后来旁边的队友在那里一个劲的讲筛素数,然后讲了一些没用的思路,不过筛素数?突然有了想法,然后修改了一下暴力的手段...
  • m0_37772713
  • m0_37772713
  • 2018-02-03 20:39:49
  • 71

Wannafly挑战赛13 - B Jxc的军训

链接:https://www.nowcoder.com/acm/contest/80/B来源:牛客网时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 262144K,其他语言524288K...
  • m0_37579232
  • m0_37579232
  • 2018-04-07 10:26:16
  • 44

Wannafly挑战赛5 D.子序列 组合数学

https://www.nowcoder.com/acm/contest/36/D 因为无论T串为何样,长串一定能构造出以T串为模板的串,也就是T串无论为何样,其实只是看T串的长度的影响...
  • qq_36553623
  • qq_36553623
  • 2017-12-09 00:25:05
  • 174

牛客网习题集 - Wannafly挑战赛13- D applese生日

链接:点击打开链接题目描述   最可爱的applese生日啦,他准备了许多个质量不同的蛋糕,想请一些同学来参加他的派对为他庆生,为了不让一部分同学感到不爽,他决定把每个蛋糕都分割成几份(也可以不分割)...
  • qq_40513946
  • qq_40513946
  • 2018-04-07 13:19:34
  • 37

Wannafly挑战赛1 B Xorto(前缀异或和)

题解:直接求一波前缀和即可,比赛时想到了前缀和,然后放弃了。。。。。好菜 #include #include #include using namespace std; typedef long l...
  • haut_ykc
  • haut_ykc
  • 2017-10-13 23:32:03
  • 234

Wannafly 挑战赛13 E VVQ 与线段 【思维 + 线段树】

传送门 题意: 一维数轴上给定很多线段, 求任意两条相交线段的异或最小值, 定义线段的异或值为它们并的长度减他们交的长度.思路: 我们随便画出一个样例可得, 对于两条相交直线[l1, r1], [l...
  • Anxdada
  • Anxdada
  • 2018-04-08 16:44:43
  • 18

Wannafly挑战赛7 - (B,C,E)

还是稍微难一点的题目有意思,B题贪心,C题概率,E题树状数组,不过E题做法应该很多 codeJan与旅行 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,...
  • sdau20163942
  • sdau20163942
  • 2018-01-07 20:32:44
  • 151
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 1054
    排名: 4万+
    最新评论