hdu-5596 GTW likes gt(模拟+优先队列)
题目链接:
从前,有nn只萌萌的GT,他们分成了两组在一起玩游戏。他们会排列成一排,第ii只GT会随机得到一个能力值b_ibi。在第ii秒的时候,第ii只GT可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的GT。
为了使游戏更加有趣,GT的首领GTW会发功mm次,第ii次发功的时间为c_ici,则在第c_ici秒结束后,b_1,b_2,...,b_{c_i}b1,b2,...,bci都会增加1。
现在,GTW想知道在第nn秒之后,会有几只GT存活下来。
第一行只有一个整数T(T\leq 5)T(T≤5),表示测试数据组数。
第二行有两个整数n,mn,m。表示GT的个数和GTW发功的次数。(1\leq n \leq 50000,1\leq m\leq 500001≤n≤50000,1≤m≤50000)
第三到n+2n+2行,每行有两个整数a_i,b_iai,bi,表示第ii只GT在哪个组和他的能力值 (0\leq a[i]\leq 1,1\leq b[i]\leq 10^6)(0≤a[i]≤1,1≤b[i]≤106)
第n+3n+3行到第n+m+2n+m+2行,每行有一个整数c_ici,表示GTW第ii次发功的时间。1\leq c[i]\leq n1≤c[i]≤n
总共TT行,第ii行表示第ii组数据中,GT存活的个数。
1
4 3
0 3
1 2
0 3
1 1
1
3
4
3 题意: 不说了; 思路: 这是一个模拟题;可以用队列的出队模拟被消灭,开两个队列表示不同的组别,然而一般的队列的复杂度跟数组的没区别,所以得用优先队列来降低复杂度;
那么问题的难点就变成了怎么定义优先级了;
我们从第一个gt一直到第n个gt,依次入队,在入队的同时要保证不同组别即另一个队列里的比他小的都出队;
所以我们要按能力的值大小定义优先级,但是能力的大小在变化,这可难办了;
我们发现,在i秒发功,那么从1到n都将加1,我们可以把b[i]-前i秒的发功次数定义成优先级就可以在判断是否出队的时候队列里的排列是单调的了;
具体的看代码解释; AC代码:
/* 5596 234MS 2764K 1585 B G++ LittlePointer*/
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+;
typedef long long ll;
const ll mod=1e9+;
int t,n,m,x,flag[N],dp[N];
struct node
{
friend bool operator<(node x,node y)
{
return x.fnum>y.fnum;
}
int ki,num,pos,fnum;
};
node po[N];
priority_queue<node>qu1,qu2;
int main()
{
scanf("%d",&t);
while(t--)
{
while(!qu1.empty())qu1.pop();
while(!qu2.empty())qu2.pop();
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d%d",&po[i].ki,&po[i].num);
po[i].pos=i;
}
memset(flag,,sizeof(flag));
for(int i=;i<m;i++)
{
scanf("%d",&x);
flag[x]++;
}
dp[]=;
for(int i=;i<=n;i++)
{
dp[i]=dp[i-]+flag[i];//dp[i]表示前i秒的发功次数;
po[i].fnum=po[i].num-dp[i-];
}
int cnt=;
for(int i=;i<=n;i++)
{
if(po[i].ki==)
{
qu1.push(po[i]);
while(!qu2.empty())
{
node fr=qu2.top();
if(fr.fnum+dp[i]<po[i].num+flag[i])qu2.pop();//dp[i]是不变的fr.fnum+dp[i]=fr.num+dp[i]-dp[fr.pos-1];
else break;//单纯的比较fr.num+dp[i]与po[i].num+flag[i]是不对的;
}
}
else
{
qu2.push(po[i]);
while(!qu1.empty())
{
node fr=qu1.top();
if(fr.fnum+dp[i]<po[i].num+flag[i])qu1.pop();
else break;
}
}
}
printf("%d\n",qu1.size()+qu2.size());
}
return ;
}
hdu-5596 GTW likes gt(模拟+优先队列)的更多相关文章
- HDU 5596 GTW likes gt 倒推
GTW likes gt 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5596 Description Long long ago, there w ...
- hdu 5596 GTW likes gt
题目链接: hdu 5596 题意不难懂(虽然我还是看了好久)大概就是说 n 个人排成一列,分成两组, 第 i 秒时第 i 个人会消灭掉前面比他 b[i] 值低的且和他不同组的人,c[i] 表示第 c ...
- HDU 5596 ——GTW likes gt——————【想法题】
GTW likes gt Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- HDU 5597 GTW likes function 打表
GTW likes function 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5596 Description Now you are give ...
- HDU 1103 Flo's Restaurant(模拟+优先队列)
Flo's Restaurant Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 5437 Alisha’s Party 模拟 优先队列
Problem Description Princess Alisha invites her friends to come to her birthday party. Each of her f ...
- HDU 5597 GTW likes function 欧拉函数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5597 题意: http://bestcoder.hdu.edu.cn/contests/contes ...
- Hdu 5595 GTW likes math
题意: 问题描述 某一天,GTW听了数学特级教师金龙鱼的课之后,开始做数学<从自主招生到竞赛>.然而书里的题目太多了,GTW还有很多事情要忙(比如把妹),于是他把那些题目交给了你.每一道题 ...
- hdu 5595 GTW likes math(暴力枚举查询)
思路:直接暴力枚举区间[l,r]的整数值,然后max和min就可以了. AC代码: #pragma comment(linker, "/STACK:1024000000,1024000000 ...
随机推荐
- Engine中如何截取线上指定两点间的线段?
//调用 IPolyline newLine = GetSubCurve(polyline, p1, p2); ESRI.ArcGIS.Display.IScreenDisplay screenD ...
- mysql 存储过程时间月份减法
declare startTime VARCHAR(19) default '2014-00-00 00:00:00'; declare tempTime VARCHAR(19) default NO ...
- iOS开发 ----- 加载动画之牛顿摆的实现
牛顿摆动画 自己看动画有一段时间了,但是还是不是很能理解其中的一些属性方法之类的东西,琢磨了一下午写了一个牛顿摆的动画,这里记录一下,一遍以后查看先上图 先说下思路 说下牛顿摆的大致运动过程 根据牛顿 ...
- java解析xml汇总
[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...
- 【西祠日志】【07】努力努力,找资料,思考,怎么做asp图片上传
[西祠日志][07]努力努力,找资料.思考.怎么做asp图片上传 (2015.07.23周四) 今天忘了带本子.直接写在书上了笔记,晚点还是夹在本子里. 学了这么久的web应用,一直都没时间去做一点 ...
- 关于finfo_file函数获取文件mime值验证出错的问题
今天在做图片上传 验证图片mime值时 突然发现 个别特殊情况下finfo_file 获取的MIME值不能直接使用, 依照官方的写法是 $finfo=finfo_open(FILEINFO_MIME ...
- Cts框架解析(15)-任务运行完
case运行完成后.会回到CtsTest的run方法中: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L ...
- Num 34 : HDOJ : 1205 吃糖果 [ 狄利克雷抽屉原理 ]
抽屉原理: 桌上有十个苹果,要把这十个苹果放到九个抽屉里,不管如何放,我们会发现至少会有一个抽屉里面至少放两个苹果. 这一现象就是我们所说的" ...
- C++再次理解虚表
#include <iostream> using namespace std; class Base { public: virtual void fun1() { cout <& ...
- Django-缓存的配置
缓存的介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗 ...