[CC-SEINC]Sereja and Subsegment Increasings
[CC-SEINC]Sereja and Subsegment Increasings
题目大意:
有长度为\(n(n\le10^5)\)的序列\(A\)和\(B\)。
在一次操作中,可以选择一个区间增加\(1\)。
求让\(A\)和\(B\)在模\(4\)意义下相等,至少要对\(A\)执行多少次操作。
思路:
对\(A,B\)对应作差,\(C_i=B_i-A_i\)。
求\(C\)的查分\(D_i=C_i-C_{i+1}\)。
如果不考虑模\(4\),答案即为\(\sum\max(D_i,0)\)。
而模\(4\)相当于可以对\(C\)区间加\(4\),对应到\(D\)上就是对于区间\((l,r]\),\(D_l+=4,D_r-=4\)。
考虑怎样选择区间能够使答案更优。
对于区间\((l,r]\),考虑以下情况:
- \(D_l=2,D_r=-3\),会使答案\(-1\);
- \(D_l=3,D_r=-2\),会使答案\(-1\);
- \(D_l=3,D_r=-3\),会使答案\(-2\)。
而其余情况都不会使答案更优。
因此可以线性扫一遍,记录\(2,3\)出现的次数,将当前点作为右端点时择优更新答案即可。
时间复杂度\(\mathcal O(n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1e5+1;
int a[N];
int main() {
for(register int T=getint();T;T--) {
const int n=getint();
for(register int i=1;i<=n;i++) a[i]=getint();
for(register int i=1;i<=n;i++) {
a[i]=(getint()-a[i]+4)%4;
}
int ans=a[n],cnt2=0,cnt3=0;
for(register int i=1;i<n;i++) {
a[i]-=a[i+1];
ans+=std::max(0,a[i]);
}
for(register int i=1;i<=n;i++) {
if(a[i]==2) cnt2++;
if(a[i]==3) cnt3++;
if(a[i]==-2) {
if(cnt3) {
cnt2++;
cnt3--;
ans--;
}
}
if(a[i]==-3) {
if(cnt3) {
cnt3--;
ans-=2;
} else if(cnt2) {
cnt2--;
ans--;
}
}
}
printf("%d\n",ans);
}
return 0;
}
[CC-SEINC]Sereja and Subsegment Increasings的更多相关文章
- CF380C. Sereja and Brackets[线段树 区间合并]
C. Sereja and Brackets time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Atitti.dw cc 2015 绿色版本安装总结
Atitti.dw cc 2015 绿色版本安装总结 1.1. 安装程序无法初始化.请下载adobe Support Advisor检测该问题.1 1.1.1. Adobe Application M ...
- 【Hello CC.NET】CC.NET 实现自动化集成
一.背景 公司的某一金融项目包含 12 个子系统,新需求一般按分支来开发,测完后合并到主干发布.开发团队需要同时维护开发环境.测试环境.模拟环境(主干).目前面临最大的两个问题: 1.子系统太多,每次 ...
- 浅谈iptables防SYN Flood攻击和CC攻击
------------------------本文为自己实践所总结,概念性的东西不全,这里粗劣提下而已,网上很多,本文主要说下目前较流行的syn洪水攻击和cc攻击------------------ ...
- checking for fcc ....no checking for cc .. no
源码编译,提示缺少gcc cc cl.exe 解决方案: yum install -y gcc glibc
- 编译器 cc、gcc、g++、CC 的区别
gcc 是GNU Compiler Collection,原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C.C++.Objective-C.Ada.Fort ...
- [CC]区域生长算法——点云分割
基于CC写的插件,利用PCL中算法实现: void qLxPluginPCL::doRegionGrowing() { assert(m_app); if (!m_app) return; const ...
- [CC]点云密度计算
包括两种计算方法:精确计算和近似计算(思考:local density=单位面积的点数 vs local density =1/单个点所占的面积) 每种方法可以实现三种模式的点云密度计算,CC里面的 ...
- 【日常小记】统计后缀名为.cc、.c、.h的文件数【转】
转自:http://www.cnblogs.com/skynet/archive/2011/03/29/1998970.html 在项目开发时,有时候想知道源码文件中有多少后缀名为.cc..c..h的 ...
随机推荐
- python进阶之类常用魔法方法和魔法属性
前言 前面我们总结过了python的关键字.运算符.内置函数.语法糖等与python魔法方法之间的关系,现在我们更细一点,看看python的面向对象编程有哪些常用的魔法属性和魔法方法. 魔法属性 对于 ...
- linux快速复制大量小文件方法 nc+tar【转】
1,在需要对大量小文件进行移动或复制时,用cp.mv都会显得很没有效率,可以用tar先压缩再解压缩的方式. 2,在网络环境中传输时,可以再结合nc命令,通过管道和tcp端口进行传输. nc和tar ...
- nginx 实现mysql的负载均衡【转】
默认Nginx只支持http的反向代理,要想nginx支持tcp的反向代理,还需要在编译时增加tcp代理模块支持,即nginx_tcp_proxy_module 下面操作步骤只让nginx支持tcp_ ...
- 3->集群架构主机克隆教程
centos7系统集群主机克隆: 有道笔记链接地址
- Git如何设置多个用户
前言 由于我们在使用GitHub时,通常不希望带有公司信息,所以需要独立的Git账户来提交练习代码,本文记录一下如何配置多个Git账户并创建公钥 正文 1.首先进入~/.ssh文件夹 2.然后创建一个 ...
- 栈应用之 后缀表达式计算 (python 版)
栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1. 中缀表达式.前缀表达式.后缀表达式区别 中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...
- dc
http://www.cnblogs.com/yjmyzz/p/docker-install-tutorial.html https://segmentfault.com/a/119000000510 ...
- springMVC源码分析--HttpMessageConverter参数read操作(二)
上一篇博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们简单介绍了一下HttpMessageConverter接口提供的几个方法,主要有以下几个方法: (1 ...
- How to detect whether socket is still connected...
How to detect whether socket is still connected… */--> div.org-src-container { font-size: 85%; fo ...
- 【转载】pygame的斜线运动
pygame是用来写2D游戏的. 实现斜线运动,无非是在x和y两个方向上分运动的合成.x方向上的运动,当撞到边界的时候取相反速度就好了. 这里是用网球王子中的图片,以及一个网球实现,效果截图: 注意看 ...