VIJOS-P1401-复制CS

来源:互联网 发布:水弹的数据 编辑:程序博客网 时间:2024/06/05 16:06

这个题只要注意取出重复区间就行了~我做的时候卡死在没有到巡视的最后就已经完成了全部的操作上面,唉,细节啊~

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=10001;struct node{    double l;    double r;    bool operator < (const node &a)const    {if(l==a.l)    return r<a.r;return l<a.l;    }}a[maxn];long long n,k;int m;int main(){    while(scanf("%lld%lld%d",&n,&k,&m)!=EOF)    {long long fi=1,s=1;for(int i=0;i<m;i++){    scanf("%lf%lf",&a[i].l,&a[i].r);    a[i].r+=a[i].l;}sort(a,a+m);double now=0,maxt=0;int i=0;while(fi<n){    if(a[i].l-now>=1.0)    {maxt=max(now,a[i].r);int len=(int)(a[i].l-now);int flag=0;for(int j=1;j<=len;j++){    fi+=s;    now++;    if(fi>=n)    {        flag=1;        break;    }    s=min(s*2,k);}    if(flag)    break;now=maxt;i++;    }    else    {maxt=now;while(i<m&&a[i].l-maxt<1.0){    maxt=max(maxt,a[i].r);        i++;}if(i>=m){    now=maxt;    while(fi<n)    {fi+=s;s=min(s*2,k);now++;    }}else    now=maxt;    }}printf("%.2lf\n",now);    }    return 0;}