正题

题目链接:https://www.luogu.com.cn/problem/P7078


题目大意

有nnn条贪吃蛇,第iii条长度为aia_iai​,每次最长的那条蛇可以选择吃掉最短的那条蛇,然后自己的长度减去其长度,也可以不吃然后结束游戏。

现在询问在所有蛇都希望吃的蛇最多且自己不会被吃的情况下最后会留下多少条蛇。

TTT次每次修改kkk个值,保证修改前后aaa单调不降。

3≤n≤106,1≤T≤10,0≤k≤1053\leq n\leq 10^6,1\leq T\leq 10,0\leq k\leq 10^53≤n≤106,1≤T≤10,0≤k≤105


解题思路

考虑一条蛇什么时候会选择不吃。

首先如果一条蛇吃掉别的蛇之后它不是最小的蛇,那么它一定会去吃这条蛇。假设最大的和次大的蛇长度为a,ba,ba,b,最小和次小的为c,dc,dc,d,由于a−c>da-c>da−c>d又有b−d<a−cb-d<a-cb−d<a−c那么显然如果bbb蛇吃了肯定会比aaa蛇先死,那么如果bbb会死那么它肯定不吃ddd那么aaa蛇显然也不会被吃。

如果一条蛇吃了别的蛇后它是最小的蛇会发生什么。记蛇从大到小排序为a,b,c,...a,b,c,...a,b,c,...,那么如果蛇aaa吃了最小的后它成最小的了且bbb会吃,那么aaa肯定不吃。此时我们就需要判断bbb是否吃了,同理的,如果bbb吃了最小的之后它也是最小的那么就需要考虑ccc吃不吃最小的。

此时递归下去直到一条吃了之后不是最小的或者只剩两条蛇时就结束了。

然后用类似于合并果子那样的方法用两个队列维护即可。

时间复杂度:O(Tn)O(Tn)O(Tn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=1e6+10;
int T,n,a[N],w[N],q1[N],q2[N];
int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
bool cmp(int x,int y)
{return (w[x]==w[y])?x<y:w[x]<w[y];}
void solve(){int h1=1,t1=n,h2=1,t2=0,v,p;T--;for(int i=1;i<=n;i++)w[q1[n-i+1]=i]=a[i];while(1){if(t1-h1+1+t2-h2+1==2){printf("%d\n",1);return;}if(t2-h2+1<=0||t1-h1+1>0&&cmp(q2[h2],q1[h1])){v=w[p=q1[h1]];p=q1[h1];h1++;if(t2-h2+1<=0||t1-h1+1>0&&cmp(q1[t1],q2[t2]))v-=w[q1[t1]],t1--;else v-=w[q2[t2]],t2--;}else{v=w[p=q2[h2]];h2++;if(t2-h2+1<=0||t1-h1+1>0&&cmp(q1[t1],q2[t2]))v-=w[q1[t1]],t1--;else v-=w[q2[t2]],t2--;}w[p]=v;if((t2-h2+1<=0||cmp(p,q2[t2]))&&(t1-h1+1<=0||cmp(p,q1[t1]))){q2[++t2]=p;break;}q2[++t2]=p;}int cnt=0,f=t2-h2+1+t1-h1+1;while(1){cnt++;if(t1-h1+1+t2-h2+1==2){printf("%d\n",f+(cnt&1));return;}if(t2-h2+1<=0||t1-h1+1>0&&cmp(q2[h2],q1[h1])){v=w[p=q1[h1]];p=q1[h1];h1++;if(t2-h2+1<=0||t1-h1+1>0&&cmp(q1[t1],q2[t2]))v-=w[q1[t1]],t1--;else v-=w[q2[t2]],t2--;}else{v=w[p=q2[h2]];h2++;if(t2-h2+1<=0||t1-h1+1>0&&cmp(q1[t1],q2[t2]))v-=w[q1[t1]],t1--;else v-=w[q2[t2]],t2--;}w[p]=v;if((t2-h2+1<=0||cmp(p,q2[t2]))&&(t1-h1+1<=0||cmp(p,q1[t1]))){q2[++t2]=p;continue;}printf("%d\n",f+(cnt&1));return;}return;
}
int main()
{T=read();n=read();for(int i=1;i<=n;i++)a[i]=read();solve();while(T){int k=read();while(k--){int x=read(),w=read();a[x]=w;}solve();}return 0;
}

P7078-[CSP-S2020]贪吃蛇【贪心,队列】相关推荐

  1. 基于STL实现自动贪心寻路算法的贪吃蛇小游戏

    基于STL实现自动贪心寻路算法的贪吃蛇小游戏 写贪吃蛇小游戏的想法来自CometOJ-Contest#13的B题,当时用STL双端队列维护蛇身的时候觉得非常方便,现在用EasyX图形库实现一下. 运行 ...

  2. python贪吃蛇控制台_如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  3. 正确的「记事本」打开方式:能渲染3D图像,还能玩贪吃蛇

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 渲染3D图像,一个「记事本」就够了. 最近,GitHub上一名叫"Kyle Halladay"的小哥,便上传了这样一个项 ...

  4. python贪吃蛇_如何用Python写一个贪吃蛇?

    阅读文本大概需要 5 分钟 作者:Hawstein http://hawstein.com/2013/04/15/snake-ai/ 前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游 ...

  5. 假期休闲,来发贪吃蛇!(Win32控制台版)

    假期无事,整理电脑文件的时候发现了以前大二时做的坦克小游戏,心血来潮,决定再来一发贪吃蛇. 游戏玩法不必多说,主要是算法实现和绘制过程. 首先,利用一个二维数组 mp[][] 来存储地图信息,其中的值 ...

  6. Love2D游戏引擎制作贪吃蛇游戏

    预览游戏 love2d游戏引擎重要函数 详情: love.load:当游戏开始时被调用且仅调用一次 love.draw:回调函数,每帧更新一次游戏画面 love.update:回调函数,每帧更新一次游 ...

  7. 贪吃蛇python小白_面向 python 小白的贪吃蛇游戏

    代码和教程详见微信公众号:Python高效编程 效果图 图片 代码和教程详见微信公众号:Python高效编程 文字部分: 引言 作为python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程 ...

  8. python设计贪吃蛇游戏论文_用Python写一个贪吃蛇AI,让程序自己玩游戏

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  9. 贪吃蛇博弈算法python_算法应用实践:如何用Python写一个贪吃蛇AI

    原标题:算法应用实践:如何用Python写一个贪吃蛇AI 前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势 ...

最新文章

  1. 近期活动盘点:统计学概论和医疗临床大数据分析讲座、24小时创新挑战:数字时代的人类健康与福祉...
  2. 火爆全网,却只有4页!ICLR爆款论文「你只需要Patch」到底香不香?
  3. 【学习笔记】11、循环语句—while
  4. Ubuntu常用基础命令
  5. 神策数据荣膺“2017 年度最受欢迎企业服务商 Top 10”
  6. dockerfile php环境变量,docker - 在Dockerfile中,如何更新PATH环境变量?
  7. 神经网络 并行预测_研究人员研究了为什么神经网络可以有效地进行预测
  8. 割点、割边(桥) tarjan
  9. 第一章--计算机系统知识
  10. 曾隐姓埋名28年,两弹一星元勋于敏逝世
  11. 周鸿祎评互联网大佬的编程能力:我能排前三
  12. 解决sklearn.metrics指标报错ValueError: Target is multiclass but average=‘binary‘. Please choose anothe...
  13. Python:pip下载库后导入Pycharm的方法
  14. Atitit 效率提升法细则 v3 t028.docx Atitit 提升效率细则 目录 1. 目标 2 1.1. 配置化增加扩展性 尽可能消除编译 方便增加 调整业务逻辑 2 1.2. 统一接口
  15. catia设计树_在CATIA目录树上**零件号原来这么简单!
  16. 前后端交互学习笔记(二):Node.js及npm学习
  17. 10.数据中台 --- 数据中台运营机制
  18. 1.8.ARM裸机第八部分-按键和CPU的中断系统
  19. 青少儿编程- App Inventor简介
  20. 微软2013校园招聘笔试题

热门文章

  1. java 录屏_java 录屏 小工具源码(idea)
  2. 单文件组件的组件传值_移动端组件化架构(下)
  3. 计算机组成与系统 报告,计算机组成与系统结构实验报告2
  4. 简述本地组策略中用户和计算机配置的差异,组策略编辑器中的计算机配置和用户配置有什么区别吗?...
  5. 云服务器下行_腾讯云轻量应用服务器简单测评
  6. 橡皮擦_日本推出改邪归正橡皮擦,看得我头顶一凉
  7. python3的float数精度_python浮点数精度问题
  8. 数据结构——图-最短路径长度中最大的一个
  9. Java并发之volatile
  10. leetcode84. 柱状图中最大的矩形