BZOJ 1555 KD之死

Posted on 2016-09-05 16:14  ziliuziliu  阅读(190)  评论(0编辑  收藏  举报

贪心,按t+w排序维护不一定放到拖车上的大根堆。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 600500
using namespace std;
struct GC
{
    int w,t,flag;
}p[maxn];
int n,m,maxv,cnt=0,sum=0,x;
priority_queue <int> q;
bool cmp(GC x,GC y)
{
    return x.w+x.t<y.w+y.t;
}
int main()
{
    scanf("%d%d%d",&n,&m,&maxv);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&p[i].w,&p[i].t);
        p[i].flag=0;
    }
    for (int i=1;i<=m;i++)
    {
        scanf("%d",&x);
        p[x].flag=1;
    }
    p[n+1].w=0;p[n+1].t=maxv;p[n+1].flag=1;
    sort(p+1,p+n+1,cmp);
    for (int i=1;i<=n+1;i++)
    {
        if (p[i].flag)
        {
            while ((sum>p[i].t) && (q.size()))
            {
                sum-=q.top();
                cnt--;q.pop();
            }
            if (!q.size() || (sum>p[i].t))
            {
                printf("Foolish SD!");
                return 0;
            }
            sum+=p[i].w;cnt++;
        }
        else
        {
            if (p[i].t>=sum)
            {
                sum+=p[i].w;cnt++;
                q.push(p[i].w);
            }
            else
            {
                if (q.size() && p[i].t>=sum-q.top() && q.top()>p[i].w)
                {
                    sum-=q.top();sum+=p[i].w;
                    q.pop();q.push(p[i].w);
                }
            }
        }
    }
    printf("%d\n",cnt-1);
    return 0;
}