难度:困难

主要算法:贪心

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

解题思路

  • 简化问题:定义直线为覆盖ai,ai+1,ai+2 的操作,跳线为覆盖ai,ai+2,ai+4的操作。题意简化为使用一些直线和一些跳线使每个位置被覆盖正好ai次。
  • 小范围思考:考虑只覆盖前2个点怎么办?如果a1等于0则不管向后移动直到a不为0。当a1不为0时,取a1和a2的最小值,做最小值条直线覆盖a1和a2。再以以较大的点为起点做最大值减最小值条跳边。这样处理后,a2和a1一定为0,则我们可以跳过a1。考虑处理a2和a3,情况与上面类似,唯一的不同是要对a3处理前面的边覆盖带来的影响。对a3有影响的是直线和与a奇偶性相同的跳线。设A为直线,B为奇偶性相同的跳线,则a3被覆盖了A+B次。有二种情况,一是a3大于A+B,则用a3-=A+B,二是a3小于A+B,情况更复杂了。我们再设一个K等于A+B-a3,将A-=k,b-=K,但要一定要保证A和B为正,然后我们应该在a3的位置上做一个标记,表示在a3的位置,向后可以免费延伸出K条线,这些线可以是直线或跳线。最后按a和a的情况处理。
  • 算法设计:由上文可知,我们可以递推处理答案。
#include <bits/stdc++.h>
using namespace std;
int t,n,a[100010];
long long A,B,C,D,ans,bi;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
A=0,B=0,C=0,D=0,ans=0;//A是直线,B是与i奇偶性相同的跳线,C是另一类跳线,D是记录可以免费提供的线
for(int i=2;i<=n+1;i++)
{
if(a[i]<A+B)//如果前面的覆盖数大于需要
{
int K=A+B-a[i];
if(K>B)A-=K-B,K-=K-B;
if(K>A)B-=K-A,K-=K-A;//保持A,B>=0;
A-=K,B-=K,a[i]-=K,D=K;//将K记录下来
}
a[i]-=A+B;//减去前面的覆盖数
bi=min(a[i-1],a[i]);//取最小值
ans+=bi,a[i-1]-=bi,a[i]-=bi,A+=bi;//用最小值更新答案
ans+=a[i-1];C+=a[i-1];a[i-1]=0;//彻底处理掉ai-1的值
a[i]+=D;ans-=D;D=0;//ai回归正常值,K条边不用价值,标记清零
swap(B,C);//奇偶交换
}
printf("%lld\n",ans);
}
return 0;
}

P6631 [ZJOI2020] 序列题解的更多相关文章

  1. P6631 [ZJOI2020] 序列

    可以将问题用形象的方式来表述.给定一排点,第 \(i\) 个点有它需要的覆盖次数 \(a_i\).有两种线段,一种能覆盖连续的一些点,称其为连续线段:另一种能覆盖相邻间隔为 \(1\) 的一些点,称其 ...

  2. HDU 1027 Ignatius and the Princess II 选择序列题解

    直接选择序列的方法解本题,可是最坏时间效率是O(n*n),故此不能达到0MS. 使用删除优化,那么就能够达到0MS了. 删除优化就是当须要删除数组中的元素为第一个元素的时候,那么就直接移动数组的头指针 ...

  3. P2023 [AHOI2009]维护序列 题解(线段树)

    题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...

  4. cojs 疯狂的魔法树 疯狂的颜色序列 题解报告

    疯狂的魔法树 一个各种操作大杂烩的鬼畜数据结构题目 首先我们注意到树的形态是半随机的 我们可以树分块,对树分成若干个块 对于每个块我们维护一个add标记表示增量 维护一个vis标记表示覆盖量 注意标记 ...

  5. C++版 - 剑指offer 面试题22:栈的压入、弹出序列 题解

    剑指offer 面试题22:栈的压入.弹出序列 提交网址: http://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId ...

  6. 【区间DP】codevs3657 括号序列题解

    题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...

  7. BZOJ4553:[HEOI2016/TJOI2016]序列——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4553 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某 ...

  8. 洛谷 P2023 [AHOI2009]维护序列 题解

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...

  9. 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解

    题目传送: P3373 [模板]线段树 2  P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...

  10. csp-s模拟测试52平均数,序列题解

    题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数 ...

随机推荐

  1. 四、【转】基于知识图谱的推荐系统(KGRS)综述

    以下文章来源于AI自然语言处理与知识图谱 ,作者Elesdspline 导语 本文是2020年针对知识图谱作为辅助信息用于推荐系统的一篇综述.知识图谱对于推荐系统不仅能够进行更精确的个性化推荐,而且对 ...

  2. 构造照亮世界——快速沃尔什变换 (FWT)

    博客园 我的博客 快速沃尔什变换解决的卷积问题 快速沃尔什变换(FWT)是解决这样一类卷积问题: \[c_i=\sum_{i=j\odot k}a_jb_k \] 其中,\(\odot\) 是位运算的 ...

  3. 01 redis 基础入门

    目录 介绍 特点 redis与memcache比较 适用场景 redis 核心配置说明 Redis 对key的通用操作命令 字符串 Hash类型 课程学习地址: https://www.bilibil ...

  4. VueJS和Javascript实现文字上下滚动效果

    一提到文字上下滚动,我们就会想到用不同的程序去实现,而且页面中有文字滚动会增加这个网页的互动和可信度. 1.Js最简单的方法是控制盒子的高度,使不断的重复添加 <html> <bod ...

  5. 提交项目到git远程仓库

    提交项目到github远程仓库 点击VCS-->Share project on Github 相关信息配置:修改完,点击share 点击add等待完成. 打开浏览器查看,可以发现我们的仓库里出 ...

  6. Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验

    Dapr 提供了一组构建块,用于抽象分布式系统中常用的概念.这包括服务.缓存.工作流.复原能力.机密管理等之间的安全同步和异步通信.不必自己实现这些功能,可以消除样板,降低复杂性,并允许您专注于开发业 ...

  7. Git 出现 Permission denied 时,重新生成ssh密钥

    1,右键本地仓库,点击  [ Git Bash Here] 出现如下对话框: 输入 ssh-keygen  然后一直回车,注意: 保存的SSH目录 在   C:\Users\xiaocj\.ssh  ...

  8. 分享一个Byte KB MB GB 单位转换方法 从《C#本质论第三版》

    static public string FormatBytes(long bytes) { string[] magnitudes = new string[] { "GB", ...

  9. 基于深度学习的入侵检测系统综述文献概述——AI科研之路

    1.研究方向的背景是什么? (1)互联网发展迅速,网络安全态势严重 (2)现在的入侵检测准确率不够高,不能适应现在的需求 2.前人做了哪方面的工作获得了什么成果? 近代: 将网络作为入侵来源之后发展( ...

  10. C语言常用数学函数

    目录 C语言常用数学函数(头文件#include "math.h") abs()函数 labs()函数 fabs()函数 floor()函数 floorf() floorl() c ...