BZOJ 1555 KD之死

Posted ziliuziliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1555 KD之死相关的知识,希望对你有一定的参考价值。

贪心,按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;
}

 

以上是关于BZOJ 1555 KD之死的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 4066 简单题(KD树)

BZOJ 2648 SJY摆棋子(KD树)

BZOJ 4520 [Cqoi2016]K远点对(KD树)

[bzoj4066/2683]简单题_KD-Tree

BZOJ-4520K远点对 KD-Tree + 堆

BZOJ-1941Hide and Seek KD-Tree