BZOJ1691: [Usaco2007 Dec]挑剔的美食家
一句话题解:贪心+treap
好几天前刚学的treap,然后真到了考treap又写不出来,这么辣鸡还搞什么OI
先按$A_i$递减排序,然后把$C_i$也递减排序,然后用一个指针指向$M$序列,遍历$N$序列,这样的话每次所找到的元素必定是$A_i \leq B_i$的
这样我们就可以专注于$B_i$和$D_i$的关系,这个关系我们用平衡树维护就行了,Treap就是个不错的选择。每次插入合法的$C_i$,然后累加每个最优的$C_i$
具体参考代码:
//OJ 1939 //by Cydiater //2016.9.10 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <cmath> #include <string> #include <iomanip> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) ; const ll oo=0x3f3f3f3f; inline ll read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ,tol=,tmp; ll ans=; struct _data{ int x,y; }a[MAXN],b[MAXN]; struct tree{ int leftt,rightt,v,siz,cnt,rnd; }t[MAXN]; namespace solution{ inline bool cmpfory(_data x,_data y){return x.y>y.y;} inline void updata(int k){t[k].siz=t[t[k].leftt].siz+t[t[k].rightt].siz+t[k].cnt;} void init(){ N=read();M=read(); up(i,,N){ a[i].x=read();a[i].y=read(); } up(i,,M){ b[i].x=read();b[i].y=read(); } sort(a+,a+N+,cmpfory); sort(b+,b+M+,cmpfory); } void lefturn(int &k){ int tt=t[k].rightt;t[k].rightt=t[tt].leftt;t[tt].leftt=k; t[tt].siz=t[k].siz;updata(k);k=tt; } void righturn(int &k){ int tt=t[k].leftt;t[k].leftt=t[tt].rightt;t[tt].rightt=k; t[tt].siz=t[k].siz;updata(k);k=tt; } void insert(int &k,int v){ ){ k=++tol;t[k].leftt=t[k].rightt=; t[k].rnd=rand();t[k].v=v;t[k].siz=t[k].cnt=; return; } t[k].siz++; if(t[k].v==v){ t[k].cnt++; return; } if(v<t[k].v){ insert(t[k].leftt,v); if(t[k].rnd>t[t[k].leftt].rnd)righturn(k); }else if(v>t[k].v){ insert(t[k].rightt,v); if(t[k].rnd>t[t[k].rightt].rnd)lefturn(k); } } void nxt(int k,int v){ )return; if(t[k].v>=v){ tmp=t[k].v; nxt(t[k].leftt,v); }else nxt(t[k].rightt,v); } void del(int &k,int v){ )return; if(v==t[k].v){ ){ t[k].cnt--; t[k].siz--; return; } ){ k=t[k].leftt+t[k].rightt; return; } if(t[t[k].leftt].rnd<t[t[k].rightt].rnd){ righturn(k); del(k,v); }else{ lefturn(k); del(k,v); } } else if(v<t[k].v){ t[k].siz--; del(t[k].leftt,v); }else{ t[k].siz--; del(t[k].rightt,v); } } void slove(){ ; up(i,,N){ while(b[j].y>=a[i].y&&j<=M) insert(root,b[j++].x); tmp=-; nxt(root,a[i].x);ans+=tmp; ){ puts("-1"); exit(); } del(root,tmp); } } void output(){ cout<<ans<<endl; } } int main(){ //freopen("input.in","r",stdin); using namespace solution; init(); slove(); output(); ; }
另外,这个会爆ll
BZOJ1691: [Usaco2007 Dec]挑剔的美食家的更多相关文章
- [BZOJ1691][Usaco2007 Dec]挑剔的美食家
[BZOJ1691][Usaco2007 Dec]挑剔的美食家 试题描述 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了. ...
- bzoj1691[Usaco2007 Dec]挑剔的美食家 平衡树treap
Description 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了.现在,Farmer John不得不去牧草专供商那里 ...
- 【贪心】【二维偏序】【权值分块】bzoj1691 [Usaco2007 Dec]挑剔的美食家
既然题目中的要求满足二维偏序,那么我们很自然地想到将所有东西(草和牛)都读进来之后,对一维(美味度)排序,然后在另一维(价值)中取当前最小的. 于是,Splay.mutiset.权值分块什么的都支持查 ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家( 平衡树 )
按鲜嫩程度排个序, 从大到小处理, 用平衡树维护价值 ---------------------------------------------------------------------- #i ...
- BZOJ_1691_[Usaco2007 Dec]挑剔的美食家_贪心
BZOJ_1691_[Usaco2007 Dec]挑剔的美食家_贪心 题意: 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返 ...
- 「BZOJ1691」[Usaco2007 Dec] 挑剔的美食家 (Treap)
Description 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了.现在,Farmer John不得不去牧草专供商那里 ...
- 【BZOJ】1691: [Usaco2007 Dec]挑剔的美食家(set+贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1691 懒得打平衡树了.... 而且multiset是很快的... 排到了rank1 T_T 贪心就是 ...
- 1691: [Usaco2007 Dec]挑剔的美食家
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 621 Solved: 280[Submit][Status][Discuss] Description ...
随机推荐
- Lucene.Net的服务器封装+APi组件 (开源)
为什么要封装 真不知道用什么标题合适,我这几天在研究Lucene.Net,觉得把Lucene.Net封装为一个独立的服务器,再提供一个给客户端调用的Api组件应该是一件很意思的事,主要优势有以下: 1 ...
- MATLAB函数freqz()
MATLAB提供了专门用于求离散系统频响特性的函数freqz(),调用freqz()的格式有以下两种:l [H,w]=freqz(B,A,N) B和A分别为离散系统的系统函数分子.分母多项式的系数向量 ...
- linux定时任务生产java服务无法执行问题案例
我写了一个重启resin的脚本,由于业务原因,需要定时在某一个时间重启下resin服务器 于是就在crontab里配置了如下内容: * * - root /usr/local/bin/resin_re ...
- Android 之px于dp在Java代码中的转换
现在由于用到了,使用代码进行动态布局,所以需要进行px于dp之间的转换. 现将其封装为方法,以便于调用. public int DpToPx(Context context,float dp){ fl ...
- 如何通过SecureCRTPortable.exe 软件远程连接某个计算机(或者虚拟机)中的某个数据库
1)双击SecureCRTPortable.exe - 快捷方式,打开软件; 2)"文件"--->"快速连接"-->弹出对话框: 2.1)输入主机名 ...
- Android点击EditText文本框之外任何地方隐藏键盘的解决办法
1,实现方法一:通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏 <LinearLayout xmlns:android=&q ...
- 关于使用 lua 脚本抢红包
1 java代码 package com.robert.RedisTest; import redis.clients.jedis.Jedis; public class RedisClient { ...
- js_RGB转16进制(rgb2hex)
输入:rgb(13,0,255) 输出:#0d00ff 在线颜色转换工具:http://www.atool.org/colorpicker.php 1 2 3 4 5 6 7 8 9 function ...
- 100803C
画个图,很容易发现少兜圈子,就是说这些限制c[i],d[i]可以看做[c[i],d[i]],不让那些区间相交,然后就可以了 #include<iostream> #include<c ...
- js学习笔记8----定时器
1.setInterval 和 setTimeout:定时器 语法:setInterval(函数名,时间间隔); 如:setInterval(fn(),1000); //表示每隔1秒执 ...