NOIP提高组 2012 借教室

来源:互联网 发布:天津港火灾知乎 编辑:程序博客网 时间:2024/05/17 01:18

二分答案+前缀和优化。

#include<cstdio>const int N=1111111;const int INF=1234567890;int a[N],d[N],s[N],t[N],c[N];int m,n,mid,now,l,r,as;int min(int A,int B){    if (A>B) return B;else return A;}bool check(int k){    if (now<k)    {        for (int i=now+1;i<=k;i++)            c[s[i]]+=d[i],c[t[i]+1]-=d[i];    }    else    {        for (int i=k+1;i<=now;i++)            c[s[i]]-=d[i],c[t[i]+1]+=d[i];    }    now=mid;    int sum=0;    for (int i=1;i<=n;i++)        {            sum+=c[i];            if (sum>a[i]) return true;        }    return false;}int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=n;i++)    scanf("%d",&a[i]);    for (int i=1;i<=m;i++) scanf("%d%d%d",&d[i],&s[i],&t[i]);    l=1;r=m;as=INF;    while (l<=r)    {        mid=(l+r)>>1;        if (check(mid)) as=min(as,mid),r=mid-1;        else l=mid+1;    }    if (as==INF) printf("0");    else    {        printf("-1\n");        printf("%d",as);    }    return 0;}
0 0
原创粉丝点击