题目链接:
http://contest-hunter.org:83/contest/0x08「基本算法」练习/0805 防线(秦腾与教学评估)
本题,数据范围很大。应该想到用二分。 可是二分怎么确定mid的左边还是右边呢。
我们继续看题目。题目保证了至多只有一个奇数点。想一下,最多只有一个。那么本题是唯一答案。同时其他地方的点都是偶数点。所以我们可以用到前缀和。如果mid的前缀和是偶数,那么奇数点一定在mid的后面。反之,在前面。可是我们无法开一个(1 << 32 - 1)的数组来保存前缀和。所以我们需要通过一个简单的变换来求出前缀和。
#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
typedef long long ll;
struct Node
{
int s,e,d;
}node[200010];
int T,N;
ll Judge(ll x)
{
ll sum = 0;
//通过遍历所有的组的防具。求出前缀和。
for(int i = 1; i <= N;i ++)
{
if(node[i].s <= x)
{
sum +=