P6631 [ZJOI2020] 序列
可以将问题用形象的方式来表述。给定一排点,第 \(i\) 个点有它需要的覆盖次数 \(a_i\)。有两种线段,一种能覆盖连续的一些点,称其为连续线段;另一种能覆盖相邻间隔为 \(1\) 的一些点,称其为为间隔线段。现在要用尽可能少的线段覆盖每个点 \(i\) 恰好 \(a_i\) 次。
发现如果没有间隔线段就是被某组织出烂的原题。显然,每次取最长的非 \(0\) 段最优。
回到本题,来证明一个结论:假设 \(a_1\sim a_i>0\),\(a_{i+1}=0\) 且 \(i>1\),选一条从 \(1\sim i\) 的连续线段一定不劣。
将 \(1\sim i\) 分成奇数偶数两组,那么每组都可以用间隔线段完全覆盖且不会影响到另一组,这意味着如果不用连续线段两者可以用上面的方法单独计算。
反之如果我们选择了一条 \(1\sim i\) 的连续线段,两组均会被完全覆盖,代价减少了 \(1\),看起来会更优。
但现在点 \(i\) 所在的组可能对后面产生贡献(覆盖到点 \(i+2\)),而另一组不行。所以我们可以以点 \(i+2\) 为开头选一条间隔线段,加上 \(1\sim i\) 的连续线段,代价为 \(2\),不劣于选两条间隔线段。
接着怎么做呢?唯一需要考虑的就是前面有线段连过来。在处理点 \(i\) 时,记连过来的连续线段数量为 \(x\),能覆盖到点 \(i\) 的间隔线段数量为 \(y\),不能覆盖到点 \(i\) 的间隔线段数量为 \(z\)。
首先处理一下特殊情况:连过来的线段太多了,即 \(x+y>a_i\),有 \(k\gets x+y-a_i\) 条线段不能向后继续连。但我们会发现留下间隔线段还是连续线段是由后面的点决定的,所以不妨将 \(x\gets x-k\),\(y\gets y-k\),反悔标记置为 \(k\),表示可以免费连向下一个点的线段个数(线段的种类可以任意选)。但是这样会出现一种情况,\(x<k\) 或 \(y<k\),此时的反悔可能是不合法的。对于这种情况,我们将少的一种线段置为 \(0\),另一种线段对应减少,即可保证合法。
然后就好办了,根据之前的结论,处理 \(a_{i-1}\) 与 \(a_i\)。能用连续线段就用,如果 \(i-1\) 还有剩下就用间隔线段。
当然还有一些需要注意的细节。
- 如果更新了标记,最后需要将 \(a_i\) 置为 \(k\),答案减去 \(k\),同时清空标记。
- 尽量从 \(i=2\) 开始做,防止出现一些边界问题。
- 最后多做一次,计算 \(n\) 位置的答案。
时间复杂度 \(O\left(n\right)\)。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define Min(x,y)((x)<(y)?x:y)
int read()
{
int A;
bool K;
char C;
C=A=K=0;
while(C<'0'||C>'9')K|=C=='-',C=getchar();
while(C>'/'&&C<':')A=(A<<3)+(A<<1)+(C^48),C=getchar();
return(K?-A:A);
}
int main()
{
int t,n;
ll last,now,k,x,y,z,tag,ans,tmp;
t=read();
while(t--)
{
n=read(),last=read();
ans=tag=x=y=z=0;
while(n--)
{
now=(n?read():0);
if(now<x+y)
//处理多余的线段
{
k=x+y-now;
//必须要结尾的线段
if(x<k)y-=k-x,k=x;
if(y<k)x-=k-y,k=y;
x-=k;
y-=k;
now-=k;
tag=k;
//向后所能免费延伸的线段
}
now-=x+y;
//新的必须经过当前点的线段
tmp=Min(last,now);
ans+=tmp;
last-=tmp;
now-=tmp;
x+=tmp;
//用连续线段覆盖
ans+=last;
z+=last;
//用间隔线段覆盖
last=now|tag;
ans-=tag;
tag=0;
//处理标记
swap(y,z);
//奇偶互换
}
cout<<ans<<endl;
}
return 0;
}
P6631 [ZJOI2020] 序列的更多相关文章
- Solution -「ZJOI 2020」「洛谷 P6631」序列
\(\mathcal{Description}\) Link. 给定一个长为 \(n\) 的非负整数序列 \(\lang a_n\rang\),你可以进行如下操作: 取 \([l,r]\),将 ...
- 【夯实PHP基础】UML序列图总结
原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...
- Windows10-UWP中设备序列显示不同XAML的三种方式[3]
阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...
- 软件工程里的UML序列图的概念和总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- BZOJ 1251: 序列终结者 [splay]
1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3778 Solved: 1583[Submit][Status][Discu ...
- 最长不下降序列nlogn算法
显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...
- [LeetCode] Sequence Reconstruction 序列重建
Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...
- [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
随机推荐
- 备战noip week8
POJ1144 网络 description: 给出一张\(N\)个点的无向图,求其中割点的个数 data range: \(N\le 100\) solution: 一道模板题(但是读入实在是把我恶 ...
- 数据结构(C++)——顺序表
顺序表和链表的比较 1.存取方式 顺序表可以随机访问,而链表只能从表头顺序查找.(因此经常查找顺序表某一个元素时,顺序表更适合) 2.逻辑结构与物理结构 顺序表中,逻辑上相邻的元素,其物理存储位置也相 ...
- new 正则
在做项目的过程中,使用正则表达式来匹配一段文本中的特定种类字符,是比较常用的一种方式,下面是对常用的正则匹配做了一个归纳整理. 匹配中文:[\u4e00-\u9fa5] 英文字母:[a-zA-Z]数字 ...
- Eureka+Hystrix(断路器、熔断器)
红圈是断路器的三种状态: 关闭:1.当consumer访问provider时,在网络超时访问内,访问成功: 2.有时互相调用会出现网络涌动,(比如北京访问广东的服务器要经过很多次路由才能达到并相应), ...
- Java学习的第三十九天
1.例3.7 100~200之间全部素数 package bgio; public class cjava { public static void main(String[]args) { int ...
- Kubernetes 1.13 的完整部署手册
前言: 非常详细的K8s的完整部署手册,由于Kubernetes版本和操作系统的版本关系非常敏感,部署前请查阅版本关系对应表 地址:https://github.com/kubernetes/kube ...
- MIT 6.S081 Lab5 Copy-On-Write Fork
前言 最近绝大多数的空闲时间都拿来锤15-445了,很久没动6.S081.前几天回头看了一下一个月前锤完的Lazy Allocation,自己写的代码几乎都不认识了.......看来总结之类的东西最好 ...
- 浅谈querySelector和getElementById之间的区别
前言: 最近学到前端一些知识,看到很多视频上许多老师都用的是querySelector而部分老师用的是getElementById,我就很疑惑,这两有啥区别,都是选择器,于是百度了一下明白了,quer ...
- 从直播商城系统的KOL效应分析,直播带货井喷的必然性
网红营销.直播带货作为近年来的热点发展迅猛,同时也捧红了一个概念:KOL.随着直播商城系统的不断完善发展,让KOL成为近年来营销最热门的香饽饽.随着原创直播平台低门槛化.模板化内容创作和大数据智能分发 ...
- java联系人管理系统简单设计
本文实例为大家分享了java联系人管理系统毕业设计,供大家参考,具体内容如下 要求: 请使用XML保存数据,完成一个联系人管理系统. 用户必须经过认证登录后方可以使用系统. 注册 ...