codeforces 617 C. Tourist's Notes (二分)

题目链接 题意:有n天的旅行,但是只剩下了m天的旅行记录,记录格式为d[i],h[d[i]],表示第i个记录是第d[i]天的,高度为h[d[i]],相邻两天的高度之差的绝对值不超过1.问满足以上条件的最大的h是多少。无解输出impossible. 思路:为了练习二分。 二分高度,然后check是否合法。注意边界,所以可以添加两个点。

/* ***********************************************
Author :111qqz
Created Time :2016年03月30日 星期三 16时53分57秒
File Name :code/cf/problem/538C.cpp
************************************************ */

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#define fst first
#define sec second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ms(a,x) memset(a,x,sizeof(a))
typedef long long LL;
#define pi pair < int ,int >
#define MP make_pair

using namespace std;
const double eps = 1E-8;
const int dx4[4]={1,0,0,-1};
const int dy4[4]={0,-1,1,0};
const int inf = 0x3f3f3f3f;
const int N=1E5+7;
const int M=1E9; //上界并不是h的最大值。。因为还可以继续往上走啊。。
int n,m;
int h[N],d[N];



bool check (int x)
{
  //  cout<<"x:"<<x<<endl;
    
    for ( int i = 1 ; i <= m-1 ; i++)
    {
	if (x<h[i]||x<h[i+1]) return  true;
	int cost = abs(x-h[i]) + abs(h[i+1]-x);
//	cout<<"cost:"<<cost<<endl;
	if (cost<=d[i+1]-d[i]) return  true;
    }
    return false;
}
int bin()
{
    int l = 0 ;
    int r = M ;
    int mid;
    while (l<=r)
    {
	mid = (l+r)/2;
	if (check(mid))
	    l = mid + 1;
	else r = mid -1;
    }
    if (r>M) return -1;
    return r;
}
int main()
{
	#ifndef  ONLINE_JUDGE 
	freopen("code/in.txt","r",stdin);
  #endif

	cin>>n>>m;
	m++;
	for ( int i = 2 ; i <= m ; i++) cin>>d[i]>>h[i];
	
	d[1] = 1;
	h[1] = h[2] + abs(d[2]-1);   //为了处理端点,于是增加两个点。
	m++;
	d[m] = n;
	h[m] = h[m-1] + abs(n-d[m-1]);
	

	for ( int i = 1 ; i <= m-1 ; i++)
	{
	    int tmp = abs(h[i+1]-h[i]);
	    if (d[i+1]-d[i]<tmp)
	    {
		puts("IMPOSSIBLE");
		return 0;
	    }
	}
	int ans = bin();
	if (ans==-1)
	{
	    puts("IMPOSSIBLE");
	}
	else
	cout<<ans<<endl;

  #ifndef ONLINE_JUDGE  
  fclose(stdin);
  #endif
    return 0;
}