定义$C_{i}$表示令$i,i+1,i+2,...$的位置减1的操作,定义$I_{i}$表示令$i,i+2,i+4,...$的位置减1的操作
结论1:一定存在一种最优解使得$\forall i$不同时存在$I_{i}$和$I/C_{i+1}$操作(用其他操作等效替代即可证明)
结论2:当$a_{1},a_{2}>0$时,一定存在一种最优解使得其中一次执行了一次$C_{1}$操作(结论1的简单推论)
根据上述结论进行贪心,记录$(a,b,c)$表示可以免费进行$a$次$C_{i}$操作、$b$次$I_{i}$操作和$c$次$I_{i+1}$操作
对于每一个位置,优先使用免费操作,按以下方式选择免费操作:
1.若$a+b\le a_{i}$,将这$a+b$次操作全部执行
2.若$a+b>a_{i}$,相当于要确定$x+y=a_{i}$,其中$0\le x\le a$且$0\le y\le b$
观察到$a_{i}-b\le x\le a$且$a_{i}-a\le y\le b$,那么必然要执行$a_{i}-b$次$C_{i}$操作和$a_{i}-a$次$I_{i}$操作
(这里有一个小问题:为了让次数为非负数,需要让$a$和$b$对$a_{i}$取min,这样显然不影响答案)
对于剩下的免费操作,这些免费操作的意义就是让答案减小$a_{i}'$,因此直接令答案减小$a_{i}'$即可
(之前不能这么做是因为操作有上限,而现在$a_{i}'$已经规定了上限,次数上限无意义)
考虑当处理完$a_{i-1}$和$a_{i}$的免费操作后即可贪心:执行$\min(a_{i-1},a_{i})$次$C_{i-1}$操作和$\max(a_{i-1}-a_{i},0)$次$I_{i-1}$操作
(还有一个细节问题:如果$a+b>a_{i}$,这$a_{i}'$次操作实际上是免费的,因此优先,所以此时$a_{i-1}$只能使用$I_{i-1}$的操作)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 int t,n,s1,s2,s3,a[100005];
4 long long ans;
5 void calc1(int k,int x){
6 a[k]-=x;
7 a[k+1]-=x;
8 s1+=x;
9 }
10 void calc2(int k,int x){
11 a[k]-=x;
12 s3+=x;
13 }
14 int main(){
15 scanf("%d",&t);
16 while (t--){
17 scanf("%d",&n);
18 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
19 s1=s2=s3=ans=0;
20 for(int i=1;i<=n;i++){
21 s1=min(s1,a[i]);
22 s2=min(s2,a[i]);
23 int k=max(s1+s2-a[i],0);
24 s1-=k;
25 s2-=k;
26 ans-=k;
27 a[i]-=s1+s2+k;
28 ans+=a[i-1];
29 calc1(i-1,min(a[i-1],a[i]));
30 calc2(i-1,max(a[i-1]-a[i],0));
31 swap(s2,s3);
32 a[i]+=k;
33 }
34 printf("%lld\n",ans+a[n]);
35 }
36 }

[loj3313]序列的更多相关文章

  1. 【夯实PHP基础】UML序列图总结

    原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...

  2. Windows10-UWP中设备序列显示不同XAML的三种方式[3]

    阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...

  3. 软件工程里的UML序列图的概念和总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...

  4. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  5. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  6. 最长不下降序列nlogn算法

    显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...

  7. [LeetCode] Sequence Reconstruction 序列重建

    Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...

  8. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  9. [LeetCode] Repeated DNA Sequences 求重复的DNA序列

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

随机推荐

  1. iOS Swift结构体与类的方法调度

    前言 hello,小伙伴们:在忙碌中闲暇之余给大家聊聊swift的知识点,今天给大家带来的是swift中结构体与类的方法调度详细区别,希望对你有所帮助,好了废话不用多说,接下来步入主题! 1.普通方法 ...

  2. 洛谷4755 Beautiful Pair (分治)

    题目描述 小D有个数列 \(a\),当一个数对 \((i,j)(i\le j)\) 满足\(a_i\)和\(a_j\)的积 不大于 \(a_i \cdots a_j\) 中的最大值时,小D认为这个数对 ...

  3. UDP接收端和发送端_Socket编程

    UDP接收端 接收端启动文件 1 import java.net.DatagramSocket; 2 import java.net.SocketException; 3 4 public class ...

  4. windows10安装MySQL8.0.27

    1.官网下载安装包:https://dev.mysql.com/downloads/mysql/ 2.将解压文件解压到你安装的目录:D:\mysql-8.0.27-winx64 注意:不要放在有中文名 ...

  5. AIbee 笔试

    CSS选择器 div+p 选择紧接在div元素之后的所有< p >元素 C++删除数组最后一个元素. 例如[1 2 3 4] 最后变为 [1 2 3] 用splice的删除,增加和替换 a ...

  6. JavaCPP快速入门(官方demo增强版)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. Coursera Deep Learning笔记 改善深层神经网络:超参数调试 正则化以及梯度相关

    笔记:Andrew Ng's Deeping Learning视频 参考:https://xienaoban.github.io/posts/41302.html 参考:https://blog.cs ...

  8. 热身 for computer industry

    项目 内容 作业属于 班级博客 作业要求 作业要求 个人课程目标 掌握软件工程基础知识 具体有助方面 个人认知与规划 其他参考文献 博客Ⅰ 博客 Ⅱ 选择计算机 你为什么选择计算机专业?你认为你的条件 ...

  9. 如何使用python 新建文件夹以及递归创建文件夹

    转载:如何使用python 新建文件夹以及递归创建文件夹 | 酷python (coolpython.net) 1. os.mkdir 使用python创建文件夹,通常使用os.mkdir方法,在使用 ...

  10. Zabbix webhook 自定义报警媒介

    场景一:使用企业微信机器人报警 图中的token是:在群组中添加机器人,机器人的webhook地址的key var Wechat = { token: null, to: null, message: ...