定义$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. Flink sql 之 TopN 与 StreamPhysicalRankRule (源码解析)

    基于flink1.14的源码做解析 公司内有很多业务方都在使用我们Flink sql平台做TopN的计算,今天同事突然问到我,Flink sql 是怎么实现topN的 ? 蒙圈了,这块源码没看过啊 , ...

  2. python socket zmq

    本篇博客将介绍zmq应答模式,所谓应答模式,就是一问一答,规则有这么几条 1. 必须先提问,后回答 2. 对于一个提问,只能回答一次 3. 在没有收到回答前不能再次提问 上代码,服务端: #codin ...

  3. 【UE4 C++】读写Text文件 FFileHelper

    CoreMisc.h 读取 FFileHelper::LoadFileToString 读取全部内容,存到 FString FString TextPath = FPaths::ProjectDir( ...

  4. Java:锁笔记

    Java:锁笔记 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. Java 锁之公平锁和非公平锁 公平锁 是指多个线程按照申请锁的顺序来获取锁,类似于排队买 ...

  5. [no code][scrum meeting] Alpha 9

    项目 内容 会议时间 2020-04-15 会议主题 OCR验收 会议时长 15min 参会人员 OCR组成员 $( "#cnblogs_post_body" ).catalog( ...

  6. Noip模拟15 2021.7.14

    T1 夜莺与玫瑰 题目越发的变态起来... 这题刚开始看超级像仪仗队,好不容易码完欧拉函数后尝试×2后输出但不对!! 于是选择了跳过.... 正解居然是莫比乌斯函数....我也是醉了 预处理完就剩下$ ...

  7. 热身训练3 Palindrome

    Palindrome 简要题意:  我们有一个字符串S,字符串的长度不超过500000. 求满足S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)(n≥2)的子串个数.  分析: 我们能通过简 ...

  8. 2021.8.3考试总结[NOIP模拟29]

    T1 最长不下降子序列 数据范围$1e18$很不妙,但模数$d$只有$150$,考虑从这里突破. 计算的式子是个二次函数,结果只与上一个值有关,而模$d$情况下值最多只有$150$个,就证明序列会出现 ...

  9. 通过串口利用printf函数输出数据

    一.printf函数格式 printf函数具有强大的输出功能 %表示格式化字符串输出 目前printf支持以下格式的输出,例如: printf("%c",a);输出单个字符. pr ...

  10. Spring MVC:HandlerMapping

    HandlerMapping 的类图 Spring中存在两种类型的handlers.第一种是 handler mappings(处理程序映射).它们的角色定位与前面所描述的功能完全相同.它们尝试将当前 ...