bzoj1533: [POI2005]Lot-A Journey to Mars

来源:互联网 发布:雕刻机编程软件 编辑:程序博客网 时间:2024/06/02 05:23

传送门
如果总油量小于总里程显然gg
考虑维护前缀油量-里程
维护区间最小值。
如果最小值<头上的值显然gg
然后随便水水。

#include<cmath>#include<cstdio> #include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#define N 1000005using namespace std;struct data{int x,y;}a[N];int b[N*2],c[2][N],sta[N*2],r[N*2];int n,res,top;void work(int x){    b[0]=0;    for (int i=1;i<=n;i++)        b[i]=b[i-1]+a[i].x-a[i].y;    for (int i=1;i<=n;i++)        b[n+i]=b[n+i-1]+a[i].x-a[i].y;    b[n*2+1]=-1e9; top=0;    for (int i=0;i<=n*2+1;i++){        while (top&&b[i]<b[sta[top]]){            r[sta[top]]=i-1;            top--;        }        sta[++top]=i;    }    for (int i=0;i<n;i++)        if (r[i]-i+1>=n) c[x][i+1]=1;}int main(){    scanf("%d",&n);    for (int i=1;i<=n;i++){        scanf("%d%d",&a[i].x,&a[i].y);        res+=a[i].x-a[i].y;    }    if (res<0){        for (int i=1;i<=n;i++)            puts("NIE");        return 0;    }    work(0);    for (int i=1,j=n;i<j;i++,j--)        swap(a[i],a[j]);    int tmp=a[1].y;    for (int i=1;i<n;i++)        a[i].y=a[i+1].y;    a[n].y=tmp;    work(1);    for (int i=1;i<=n;i++)        if (c[0][i]||c[1][n-i+1])            puts("TAK");        else puts("NIE"); } 
原创粉丝点击