繁华模拟赛 旅行者的笔记

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 100005;
int n,m,cnt,d[maxn],h[maxn];
int main(){
    freopen("note.in","r",stdin);
    freopen("note.out","w",stdout);
    cin>>n>>m;
    for(int i = 1;i <= m;i++){
        scanf("%d%d",&d[i],&h[i]);
    }
    int ans = max(h[m] + n - d[m],h[1] + d[1] - 1);
    int hg,lw,div,mid;
    for(int i = 2;i <= m;i++){
        div = h[i] - h[i-1];
        if(div < 0) div = -div;
        if(div > d[i]-d[i-1]){
            cout<<"IMPOSSIBLE";
            return 0;
        }
        mid = (h[i] + h[i-1] + d[i] - d[i-1]) >> 1;
        ans = max(ans,mid);
    }
    cout<<ans;
    return 0;
}

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<cstdlib>
#include<string>
#include<bitset>
#define INF 200000000
#define N 100005
#define fi first
#define se second
#define debug(x) cout<<#x<<"="<<x<<endl
#define MP(x,y) make_pair(x,y)
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
int a[N],b[N];
int main()
{
    int n,m,ans=0,flag,t,l,r,mid,x,now,i;
    freopen("note.in","r",stdin);
    freopen("note.out","w",stdout);
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
        if(i==1)
            ans=b[i]+a[i]-1;
        else
        {
            t=a[i]-a[i-1];
            x=b[i]-b[i-1];
            if(abs(x)>t)
            {
                printf("IMPOSSIBLE\n");
                return 0;
            }
            x=abs(x);
            ans=max(ans,max(b[i],b[i-1]));
            l=0,r=INF;
            now=0;
            while(l<=r)
            {
                mid=(l+r)>>1;
                if(mid+abs(mid-x)<=t)
                    now=mid,l=mid+1;
                else r=mid-1;
            }
            ans=max(ans,min(b[i],b[i-1])+now);
        }
        if(i==m)
            ans=max(ans,b[i]+n-a[i]);
    }
    cout<<ans<<endl;
    return 0;
}
// davidlee1999WTK 2015/
// srO myk Orz
//ios::sync_with_stdio(false);
/*
100 1
10 10
*/
时间: 2024-10-24 21:11:11

繁华模拟赛 旅行者的笔记的相关文章

[繁华模拟赛]Evensgn 剪树枝

Evensgn 剪树枝 题目 繁华中学有一棵苹果树.苹果树有 n 个节点(也就是苹果),n − 1 条边(也就 是树枝).调皮的 Evensgn 爬到苹果树上.他发现这棵苹果树上的苹果有两种:一 种是黑苹果,一种是红苹果.Evensgn 想要剪掉 k 条树枝,将整棵树分成 k + 1 个 部分.他想要保证每个部分里面有且仅有一个黑苹果.请问他一共有多少种剪树枝 的方案? INPUT 第一行一个数字 n,表示苹果树的节点(苹果)个数. 第二行一共 n − 1 个数字 p0, p1, p2, p3,

NOIP模拟赛-旅行者问题 解题报告

题目 :http://www.tsinsen.com/P9143 题是我发现.想测可以测.已经分享出去了. 旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起点的距离为ai千米(ai为非负整数).不存在两个目的地和起点的距离相同. 从第i个目的地走到第j个目的地所走的路程为 |ai-aj|千米.我们把参观n个目的地的顺序称作一次“旅行”.lahub

繁华模拟赛 Evensgn的债务

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #define ll int using namespace std; const int maxn = 1000005; ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(

繁华模拟赛 ljw分雕塑

/* 用f[i][k]表示考虑到第i个雕塑,分成k组,可不可行(这是一个bool类型的数组) 转移: f[i][k]=f[j][k-1],sum[i]-sum[j]合法 */ #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int max_n = 2010;

繁华模拟赛 找十字架

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; int n; char s[205][205],cmd; int main(){ freopen("puzzle.in","r",stdin); freopen("puzzle

繁华模拟赛 Vincent的城堡

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll mod = 1000000007; ll n,k,c[20][20]; ll ansa,ansb,ans; void get_c(){ for(int i = 1;i

繁华模拟赛 Evensgn玩序列

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; const int maxn = 5000; int n,a[maxn],b[maxn],c[maxn],rka[maxn],rkb[maxn],rkc[maxn]; bool visa[maxn],visb[maxn],vi

繁华模拟赛 ljw搭积木

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; const int maxn = 6005; int n,x[maxn]; int cmd,cnt,ans,max_x; int main(){ freopen("box.in","r"

繁华模拟赛 Vicent坐电梯

/*n<=5000­这样就不能用O(n)的转移了,而是要用O(1)的转移.­注意我们每次的转移都来自一个连续的区间,而且我们是求和­区间求和?­前缀和!­令sum[step][i]表示f[step][1~i]的和­还是以B下侧为例­ f[step][i]=sum[step-1][i-1]+sum[step-1][k]-sum[step-1][i] */#include <cstdio> #include <cstring> #include <cstdlib> #