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;
}
时间: 2024-07-31 15:55:30

BZOJ 1555 KD之死的相关文章

BZOJ1555 KD之死

如果没有必选的限制条件,就是水题了... 只要按照w + t排序就可以了,然后搞个堆来维护 于是有了限制条件,还是水题... 到了必选的时候强制选上,不加入堆中即可. 1 /************************************************************** 2 Problem: 1555 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:2228 ms 7 Memory:10948 kb 8

文华财经函数大全

文华财经函数大全 1.引用数据 AVPRICE 引用均价(在盘后对于国内三个期货交易所指结算价)SETTLE 引用结算价(如果用在周期小于'日'的K线上如5分钟K线,一小时k线,每根k线返回的值表示这根k线当日开盘时到这根k线的为止的结算价(均价)如果用在周期大于等于'日'的K线上,返回当根K线结束时间所在日的结算价.)CLOSE 引用收盘价(在盘中指最新价),也可简写为C.HIGH 引用最高价,也可简写为H.LOW 引用最低价,也可简写为L.OPEN 引用开盘价,也可简写为O.OPI 引用持仓

bzoj 3053 HDU 4347 : The Closest M Points kd树

bzoj 3053 HDU 4347 : The Closest M Points  kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差较大的维度分开(建树常数大)或者每一位轮换分割(询问常数大),后者更快也更好些,以后就果断写第二种了. #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using

BZOJ 2648 SJY摆棋子 / 2716 Violet 3 天使玩偶 K-D树

题目大意:平面上有一些点,问一个点周围离它最近的点的曼哈顿距离是多少.支持动态加点. 思路:CDQ分治可以离线解决,但是SJY是卡CDQ的,天使玩偶可以过.毕竟K-D树的O(sqrt(n))的时间复杂度摆在那. K-D树理解起来其实不难,有k个维度的时候,每一层按照一个维度排序,取出按照这个维度排序的中位数,当作这个块的根,然后将这个块分开.还有一个比较重要的东西就是估价函数,这个函数根据不同的题可能不同.股价函数的主要用途就是对搜索进行剪枝,如果估价函数就已经大于当前的最优答案了,那就不用搜这

BZOJ 2626 JZPFAR K-D树

题目大意:给出平面上的一些点,求到一个点的最远的第k个点的标号. 思路:朴素的K-D树建树,然后在搜索的时候维护一个小跟堆,保留着最大的k个点,然后吧第k大的点作为基准点来判断是否更新其他的点. CODE: #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #de

BZOJ 4066 简单题(KD树)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支持矩阵查询即可,每隔5000个插入暴力重构树. [代码] #include <cstdio> #include <algorithm> using namespace std; const int N=300000,INF=1e9; namespace KD_Tree{ struct

BZOJ 2648: SJY摆棋子(K-D Tree)

Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 6051  Solved: 2113[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子.此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) .现在给出N<=500000个初始棋子.和M<=5

BZOJ 1941: [Sdoi2010]Hide and Seek(k-d Tree)

Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 1712  Solved: 932[Submit][Status][Discuss] Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. 但是,他们觉得,玩普通的捉迷藏没什么意思,还是不够寂寞,于是,他们决定玩寂寞无比的螃蟹版捉迷藏,顾名思义

BZOJ 1941 SDOI 2010 Hide and Seek K-D树

题目大意:给出平面上n个点,一个点离所有点的最长距离和最短距离的差最小,求这个最小的差. 思路:50W的数据为何O(nsqrt(n))的暴力能过??? CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 500010 #define INF 0x3f3f3f3f using namespace std; #define