结论:若$a_{n}-a_{1}\ge a_{2}$,那么一定会吃掉

证明:分类讨论,若$a_{n-1}$也吃掉了$a_{2}$,就说明$a_{n-1}$之后不会被吃掉,而$a_{n-1}-a_{2}\le a_{n}-a_{1}$,因此$a_{n}$也不会被吃掉;若$a_{n-1}$不吃$a_{2}$,那么$a_{n}$同样也不会被吃掉

(注意,这只是说明满足这一条件下一定会吃,而不是吃一定要满足此条件)

根据这个结论,可以模拟直至$a_{n}-a_{1}<a_{2}$

考虑接下来是否会吃,如果有$a_{n-1}-(a_n-a_{1})\ge a_{2}$,那么一定不会吃(吃了$a_{n-1}$就一定可以吃他),类似的,如果$a_{n-1}-a'_{1}<a_{2}$且$a_{n-2}-a''_{1}\ge a_{2}$,那么一定可以吃(因为$a_{n-1}$一定不会吃)……

换言之,$a_{n}$吃掉$a_{1}$当且仅当下一次出现$a_{n'}-a_{1}\ge a_{2}$时$n$与$n'$同奇偶,正确性可以归纳得到,同时下一次$n-1$与$n'$就不同奇偶了,即不能吃掉

如何维护这个过程,对两部分分别维护:

1.对于第一部分,即每一次都有$a_{n}-a_{1}<a_{2}$,将所有点分为经过操作和未经过操作两部分,根据上面证明的过程,越晚经过操作的越小,因此用一个队列维护两部分,最小值和最大值都可以得到

2.对于第二部分,直接令$a_{1}=a_{n}-a_{1}$即可(当然要判断一下)

还有一些特殊情况,主要是关于$n=2$时的判断

1.对于第一部分,即模拟直到$a_{n}-a_{1}<a_{2}$,若最终$n=2$,则答案为1(可证一定有$a_{n}\ge \sum_{i=1}^{n-1}a_{i}$);

2.对于第二部分,即模拟直到$a_{n}-a_{1}\ge a_{2}$,若最终$n'=1$,令$n'=2$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define fi first
5 #define se second
6 set<pair<int,int> >s;
7 deque<pair<int,int> >q1,q2;
8 int t,n,m,x,y,a[N];
9 pair<int,int> b[N];
10 int calc(int n){
11 q1.clear(),q2.clear();
12 for(int i=1;i<=n;i++)q1.push_back(make_pair(a[i],i));
13 pair<int,int>x,y,z;
14 while (1){
15 if (n==2)return 1;
16 if ((q2.empty())||(q1.back()>q2.back())){
17 x=q1.back();
18 q1.pop_back();
19 }
20 else{
21 x=q2.back();
22 q2.pop_back();
23 }
24 y=q1.front();
25 q1.pop_front();
26 z=make_pair(x.fi-y.fi,x.se);
27 if (((q1.empty())||(q1.front()>z))&&((q2.empty())||(q2.front()>z))){
28 q1.push_front(y);
29 q1.push_back(x);
30 break;
31 }
32 n--;
33 q2.push_front(z);
34 }
35 int nn=0;
36 while ((!q1.empty())||(!q2.empty()))
37 if ((!q1.empty())&&((q2.empty())||(q1.front()<q2.front()))){
38 b[++nn]=q1.front();
39 q1.pop_front();
40 }
41 else{
42 b[++nn]=q2.front();
43 q2.pop_front();
44 }
45 while (nn>2){
46 x=make_pair(b[nn].fi-b[1].fi,b[nn].se);
47 if (x>=b[2])break;
48 b[1]=x;
49 nn--;
50 }
51 return n-((n&1)==(nn&1));
52 }
53 int main(){
54 scanf("%d%d",&t,&n);
55 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
56 printf("%d\n",calc(n));
57 t--;
58 while (t--){
59 scanf("%d",&m);
60 for(int i=1;i<=m;i++){
61 scanf("%d%d",&x,&y);
62 a[x]=y;
63 }
64 printf("%d\n",calc(n));
65 }
66 return 0;
67 }

[luogu7078]贪吃蛇的更多相关文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  2. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  3. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  4. JavaScript-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  5. juery实现贪吃蛇的游戏

    今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...

  6. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  7. 控制台游戏引擎CGE——贪吃蛇

    今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...

  8. 原生JS制作贪吃蛇小游戏

    感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...

  9. 基于AT89C51单片机的贪吃蛇电子游戏(仿真)

    有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...

随机推荐

  1. Powerful Number 学习笔记

    定义 对于一个正整数 \(n\) ,若完全分解之后不存在指数 \(=1\) ,则称 \(n\) 为 \(\text{Powerful Number}\) . 可以发现的是,在 \([1,n]\) 中, ...

  2. dubbo注册中心占位符无法解析问题(二)

    dubbo注册中心占位符无法解析问题 前面分析了dubbo注册中心占位符无法解析的问题. 并给出了2种解决办法: 降低mybatis-spring的版本至2.0.1及以下 自定义MapperScann ...

  3. SpringCloud微服务实战——搭建企业级开发框架(四):集成SpringCloud+SpringBoot

    1.在GitEgg工程的根目录,最上级父pom.xml文件中引入需要依赖的库及Maven插件,设置编码方式: <!--?xml version="1.0" encoding= ...

  4. dwr简单应用及一个反向ajax消息推送

    由于项目中最近需要用到dwr实现一些功能,因此在网上和dwr官网上找了一些资料进行学习.在此记录一下.(此处实现简单的dwr应用和dwr消息反向推送) 一.引入dwr的包 <dependency ...

  5. springboot读取配置文件中的信息

    在一个项目中,我们有时候会把一些配置信息写入到一个配置文件中,在java代码中读取配置文件的信息.在此记录下读取属性文件中的内容. 在springboot项目中,springboot的配置文件可以使用 ...

  6. mongodb的聚合操作

    在mongodb中有时候我们需要对数据进行分析操作,比如一些统计操作,这个时候简单的查询操作(find)就搞不定这些需求,因此就需要使用  聚合框架(aggregation) 来完成.在mongodb ...

  7. SpringCloud+RocketMQ实现分布式事务

    随着互联网公司的微服务越来越多,分布式事务已经成为了我们的经常使用的.所以我们来一步一步的实现基于RocketMQ的分布式事务.接下来,我们将要做的主题写出来. RocketMQ的分布式事务结构和说明 ...

  8. Verdi Protocol Analyzer Debug 简单使用

    转载:Verdi Protocol Analyzer Debug 简单使用_Holden_Liu的博客-CSDN博客_verdi 技巧 文档与源码: User Guide: UVMDebugUserG ...

  9. Jquery校验中国身份证号码是否正确

    在项目中使用表单时经常会涉及到身份证号码是否正确的校验,下面看看应该中国二代身份证号码应该怎么用Jquery校验呢? 二代身份证校验码的计算方法 二代身份证由17位数字和一位校验码组成,那么校验方法是 ...

  10. 树行DP小结

    顾名思义:就是在树上做的DP,依据DFS的性质,在访问过儿子之后返回后将儿子的状态传递给父亲... 先看例题: 此题用贪心也能过,不过正解是DP. 对于树上的DP我们可以直接考虑最优解下各点的状态来方 ...