2011:【20CSPS提高组】贪吃蛇

时间限制: 2000 ms         内存限制: 262144 KB
提交数: 736     通过数: 180

【题目描述】

草原上有 n 条蛇,编号分别为 1,2,⋯,n。初始时每条蛇有一个体力值ai,我们称编号为 x 的蛇实力比编号为 y 的蛇强当且仅当它们当前的体力值满足 ax>ay,或者 ax=ay 且 x>y。

接下来这些蛇将进行决斗,决斗将持续若干轮,每一轮实力最强的蛇拥有选择权,可以选择吃或者不吃掉实力最弱的蛇:

1.如果选择吃,那么实力最强的蛇的体力值将减去实力最弱的蛇的体力值,实力最弱的蛇被吃掉,退出接下来的决斗。之后开始下一轮决斗。

2.如果选择不吃,决斗立刻结束。

每条蛇希望在自己不被吃的前提下在决斗中尽可能多吃别的蛇(显然,蛇不会选择吃自己)。

现在假设每条蛇都足够聪明,请你求出决斗结束后会剩几条蛇。

本题有多组数据,对于第一组数据,每条蛇体力会全部由输入给出,之后的每一组数据,会相对于上一组的数据,修改一部分蛇的体力作为新的输入。

【输入】

第一行一个正整数 T,表示数据组数。

接下来有 T 组数据,对于第 1 组数据,第一行一个正整数 n,第二行 n个非负整数表示 ai。

对于第 2 组到第 T 组数据,每组数据:

第一行第一个非负整数 k 表示体力修改的蛇的个数。

第二行 2k 个整数,每两个整数组成一个二元组 (x,y),表示依次将 ax的值改为 y。一个位置可能被修改多次,以最后一次修改为准。

【输出】

输出 T 行,每行一个整数表示最终存活的蛇的条数。

【输入样例】

2
3
11 14 14
3
1 5 2 6 3 25

【输出样例】

3
1

【提示】

【样例 1 解释】

第一组数据,第一轮中 3 号蛇最强,1 号蛇最弱。若 3 号蛇选择吃,那么它将在第二轮被 2 号蛇吃掉。因此 3 号蛇第一轮选择不吃,3 条蛇都将存活。

对于第二组数据,3 条蛇体力变为 5,6,25。第一轮中 3 号蛇最强,1 号蛇最弱,若它选择吃,那么 3 号蛇体力值变为 20,在第二轮中依然是最强蛇并能吃掉 2 号蛇,因此 3 号蛇会选择两轮都吃,最终只有 1 条蛇存活。

【样例 2 输入】

2
5
13 31 33 39 42
5
1 7 2 10 3 24 4 48 5 50

【样例 2 输出】

5
3

【数据范围与提示】

对于 20%的数据:n=3。

对于 40%的数据:n≤10。

对于 55%的数据:n≤2000。

对于 70%的数据:n≤5×104。

对于 100%的数据:3≤n≤106,1≤T≤10,0≤k≤105,0≤ai,y≤109。保证每组数据(包括所有修改完成后的)的 ai 以不降顺序排列。

代码:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=1e6+100,INF=1e9;
struct Node
{int val,num;#define val(i) a[i].val#define num(i) a[i].numbool operator < (const Node y){return val==y.val?num<y.num:val<y.val;}bool operator == (const Node y){return val==y.val && num==y.num;}
}a[N];
int T,n,k,ph,pb;
queue<Node> q;
Node blank={0,0},black={INF,INF};
Node Max(Node x,Node y)
{return (x<y)?y:x;
}
Node Min(Node x,Node y)
{return (x<y)?x:y;
}
bool query(Node la)
{int cnt=0;Node bk=Min(pb<ph?a[pb+1]:black,q.size()?q.back():black);while(1){Node hd=Max(pb<ph?a[ph]:blank,q.size()?q.front():blank);if(a[ph]==hd)ph--;elseif(q.size())q.pop();if(hd==bk)break;hd.val-=la.val;if(bk<hd)break;la=hd;cnt++;}return cnt&1;
}
int main()
{scanf("%d",&T);for(int i=1;i<=T;i++){if(i==1){scanf("%d",&n);for(int j=1;j<=n;j++)scanf("%d",&val(j)),num(j)=j;}else{scanf("%d",&k);for(int j=1,x,y;j<=k;j++){scanf("%d%d",&x,&y);val(x)=y;}}ph=n,pb=1;while(q.size())q.pop();while(pb<=ph){Node x=Max((ph>pb)?a[ph]:blank,q.size()?q.front():blank);if(a[ph]==x)ph--;elseq.pop();x.val-=val(pb);if(x<a[pb+1] && n-pb>1){if(query(x))pb++;break;}q.push(x);pb++;}printf("%d\n",n-pb+1);}return 0;
}

信息学奥赛一本通2011:【20CSPS提高组】贪吃蛇相关推荐

  1. 信息学奥赛一本通(C++版)NOIP提高组(1820-1829)

    信息学奥赛一本通(C++版)NOIP提高组目录 //1820 [题目描述] 我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所 处位置的(值减1)为指数,以10为底数的幂之和的 ...

  2. 《信息学奥赛一本通 提高篇》

    提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...

  3. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  4. 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂

    信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...

  5. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  6. 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分

    信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...

  7. 信息学奥赛一本通 提高篇 第5章 矩阵乘法

    例1 矩阵AXB 信息学奥赛一本通(C++版)在线评测系统 [矩阵乘法]矩阵A×B_Uletay-CSDN博客 矩阵乘法--矩阵A×B_vina的博客-CSDN博客 一本通1641[例 1]矩阵 A× ...

  8. 《信息学奥赛一本通 提高篇》 第四部分 数据结构 第4章 倍增求LCA

    例题1 点的距离 信息学奥赛一本通(C++版)在线评测系统 例题2 暗的连锁(Poj3417) 信息学奥赛一本通(C++版)在线评测系统 LOj10131 暗的连锁_juruo_xlh-CSDN博客 ...

  9. 信息学奥赛一本通在线提交地址

    信息学奥赛一本通 1 C++语言入门 1.1 综合 1.1.1 P1458 地球人口承载力估计 正确: 770 提交: 1794 比率: 42.92 % 1.1.2 P1686 Hello, Worl ...

  10. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

最新文章

  1. 用日志记录LINQ中的所有增删改的SQL语句的方法
  2. 在ASP程序中访问Access数据库
  3. 【转载翻译】Debian配置Networking 和 apt-get 源信息 开启root远程登录权限
  4. VMware NAT模式设置静态IP(可上网)
  5. tp5连接mongo和mysql_tp5(thinkPHP5)操作mongoDB数据库的方法
  6. onlyoffice中文字体下载
  7. opencv的下载与安装
  8. Qt5+STM32F407+步进电机 | 通过电脑控制步进电机实现:6+2通道、速度可变、运动精确步数的教程——基础知识(2/4)
  9. spring cloud oauth2 资源服务器配置
  10. c语言 标准正态分布表,标准正态分布表
  11. 网络抓取ts文件转mp4_TS格式的视频文件怎么转换成mp4文件。
  12. 晶体二极管的分类大全
  13. 网络攻防“三剑客”正式加盟墨者安全 担任首席安全顾问
  14. 移动魔百盒CM211-1_YS代工_S905L3B_RTL8822C_线刷固件包
  15. python编译 pyd 工具_windows平台 python生成 pyd文件
  16. Excel常见技巧GIF示例
  17. 新手拍短视频技术总结:真实 随性 用心
  18. 微信公众号官网平台与微信公众号第三方平台的区别
  19. 最新的iOS14操作系统全面消息重装上阵
  20. 全景分割相关论文写作与准备笔记

热门文章

  1. 哥德巴赫猜想c#语言,哥德巴赫猜想 C#
  2. windows10常见故障排查
  3. Excel -- 行列数据移动(移动复制)
  4. unity 物体移动方式的一些笔记
  5. 重磅报告 | 《中国企业2020:人工智能应用实践与趋势》
  6. AP3128 DC/DC转换器 小封装,高性能 异步升压10白光LED驱动
  7. 对深度学习程序进行性能优化之前该理解的几个知识点(一)
  8. PTA 7-18 新浪微博热门话题
  9. 助教日志_沈航软件工程评分1.2班第三周作业及总评成绩
  10. 入侵html数据库,教你如何暴库(网站入侵)