CodeForces CF862E题解
\(Part\ 1:\)
我们发现每次修改动的是\(a\)串,所以对于这个答案的公式,\(b_{i+j}\)的部分是可以求出来的。所以我们可以把公式改成如下所示:
\(f(j)=|\sum_{i=1}^{n}\ (-1)^i*b_{i+j}+\sum_{i=1}^{n}\ (-1)^{i-1}*a_{i}|\),\(0\le j\le m-n\)。
第一部分可以预处理。
在预处理的过程中我们不管绝对值,也就是会出现负数,这一点很重要的。
但是呢,我们发现对于不同的\(j\),每一个\(i+j\)的奇偶性是不一样的,所以我们不能心安理得的算出来就完事了。
我们不妨设第一个\(j\)是偶数,我们用一个前缀和数组\(sum\),其中\(sum_i\)表示当\(j\)为偶数的时候\(b\)的前缀和。
计算方法\(:\)
for(int i=1;i<=m;i++) if(i&1) b[i]=-b[i];
for(int i=1;i<=m;i++) sum[i]=sum[i-1]+b[i];
然后我们计算第一轮的答案,也就是我们先把不经过更改的\(a\)数组的答案计算出来,然后得出第一轮的答案,先把第一轮整个\(ans\)数组求出来。
之后呢,因为题目问的是最小值,所以我们要找出距离\(0\)最近的\(f_j\),输出这个最小值即可。
\(Part\ 2:\)
前面我们说过了如何处理第一轮的答案。
接下来我们看如何应付修改。
最开始是想用线段树维护一下,毕竟区间修改嘛。但是后来发现维护绝对值的时候特别麻烦,会影响到正确性,所以我们重新考虑。
我们发现,这个每次对\(a\)数组的修改是全局性的,也就是说,如果当前这个\(a_i\)匹配到的是\(-1\)的奇数次方,那么就是\(-a_i\),每次加上\(d\)的话对答案的更新贡献就变成了\(-d\)。同理,如果匹配到的是\(-1\)的偶数次方,那么对答案的更新贡献就是\(+d\)。然后我们发现这个事情特别爽,因为相邻两个位是可以相互抵消的。但是呢,我们这里特别需要处理的就是\(l,r\)奇偶性相同的问题。
\(i.\)如果\(l\%2==r\%2==0\),那么两边的数字都是偶数,我们最后一定会多出来一个孤零零的\(-d\)。
\(ii.\)如果\(l\%2==r\%2==1\),那么两边的数字都是奇数,最后一定会多出来一个孤零零的\(+d\)。
然后我们再记录一个偏移量\(shift\),表示每次更新答案的情况,例如某次\(update\)多出来一个\(-d\),我们的\(shift-=d\)。这个\(shift\)记录的相当于一个前缀和,所以每次都把答案加上\(shift\)。
\(Code:\)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,q,ans;
int a[N],b[N],sum[N],f[N];
int read()
{
int x=0,f=1;
char c=getchar();
while (c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while (c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
int higher(int x)
{
int l=0,r=m-n,mid,cnt=0x3f3f3f3f3f3f3f3f;
while (l<=r)
{
mid=(l+r)>>1;
if(x<f[mid]+ans) cnt=mid,r=mid-1;
else l=mid+1;
}
if(cnt==0x3f3f3f3f3f3f3f3f) return cnt;
return f[cnt];
}
int lower(int x)
{
int l=0,r=m-n,mid,cnt=0x3f3f3f3f3f3f3f3f;
while (l<=r)
{
mid=(l+r)>>1;
if(x>=f[mid]+ans) cnt=mid,l=mid+1;
else r=mid-1;
}
if(cnt==0x3f3f3f3f3f3f3f3f) return cnt;
return f[cnt];
}
signed main()
{
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++) b[i]=read();
for(int i=1;i<=m;i++) if(i&1) b[i]=-b[i];
for(int i=1;i<=m;i++) sum[i]=sum[i-1]+b[i];
for(int i=1;i<=n;i++) {if(i%2) ans+=a[i];else ans-=a[i];}
for(int i=0;i<=m-n;i++)
{
if(!(i%2)) f[i]=ans+sum[n+i]-sum[i];
else f[i]=ans+sum[i]-sum[n+i];
}
sort(f,f+m-n+1);
ans=0;
cout<<min(abs(higher(0)),abs(lower(0)))<<endl;
while (q--)
{
int l=read(),r=read(),d=read();
if((l&1) && (r&1)) ans+=d;
if(!(l&1) && !(r&1)) ans-=d;
cout<<min(abs(higher(0)+ans),abs(lower(0)+ans))<<endl;
}
return 0;
}
CodeForces CF862E题解的更多相关文章
- codeforces#536题解
CodeForces#536 A. Lunar New Year and Cross Counting Description: Lunar New Year is approaching, and ...
- codeforces 1093 题解
12.18 update:补充了 $ F $ 题的题解 A 题: 题目保证一定有解,就可以考虑用 $ 2 $ 和 $ 3 $ 来凑出这个数 $ n $ 如果 $ n $ 是偶数,我们用 $ n / 2 ...
- Codeforces Numbers 题解
这题只需要会10转P进制就行了. PS:答案需要约分,可以直接用c++自带函数__gcd(x,y). 洛谷网址 Codeforces网址 Code(C++): #include<bits/std ...
- Codeforces 691E题解 DP+矩阵快速幂
题面 传送门:http://codeforces.com/problemset/problem/691/E E. Xor-sequences time limit per test3 seconds ...
- Codeforces 833B 题解(DP+线段树)
题面 传送门:http://codeforces.com/problemset/problem/833/B B. The Bakery time limit per test2.5 seconds m ...
- Codeforces 840C 题解(DP+组合数学)
题面 传送门:http://codeforces.com/problemset/problem/840/C C. On the Bench time limit per test2 seconds m ...
- Codeforces 515C 题解(贪心+数论)(思维题)
题面 传送门:http://codeforces.com/problemset/problem/515/C Drazil is playing a math game with Varda. Let’ ...
- Codeforces 475D 题解(二分查找+ST表)
题面: 传送门:http://codeforces.com/problemset/problem/475/D Given a sequence of integers a1, -, an and q ...
- CodeForces CF875C题解
题解 非常有意思的\(2-SAT\)的题. 听学长讲完之后感觉确实容易想到\(2-SAT\),顺理成章. 显然,对于两个串,对咱们来说有意义的显然是两个串中第一个不同的数字.那么,我们假设两个串分别是 ...
随机推荐
- blogs & cnblogs
blogs & cnblogs https://www.cnblogs.com/xgqfrms https://i.cnblogs.com/diaries https://i.cnblogs. ...
- LeetCode & linked list bug
LeetCode & linked list bug add-two-numbers shit test /** * Definition for singly-linked list. * ...
- You Don't Know the Hack tech in the frontend development
You Don't Know the Hack tech in the frontend development 你所不知道的前端黑科技 css in js animation https://www ...
- Baccarat凭什么吸引做市商?2021年将如何发展?
在过去的一年里,基于资金池的AMM自动化做市商几乎统治了所有DeFi活动,他们没有订单簿,而是根据算法曲线提供资产.尽管在流动性和交易方面取得了令人惊叹的成绩,但是其自身具有无常损失.多代币敞口以及低 ...
- 手把手教你Spring Boot整合Mybatis Plus 代码生成器
一.在pom.xml中添加所需依赖 <!-- MyBatis-Plus代码生成器--> <dependency> <groupId>com.baomidou< ...
- docker仓库之harbor高可用 (三)
基于上一篇部署完成了企业级仓库harbor的部署,今天我们来聊聊什么是harbor的高可用 Harbor 支持基于策略的 Docker 镜像复制功能,这类似于 MySQL 的主从同步,其可以实现不同的 ...
- Linux磁盘分区格式化和扩容
Note:根据各系统上磁盘的类型不同,磁盘命名规则也会不同:例如/dev/xvd,/dev/sd,/dev/vd,/dev/hd 目录 磁盘格式化 MBR格式 GPT分区 磁盘扩容 MBR格式扩容 G ...
- Kubernetes-3.安装
docker version:19.03.14 kubernetes version:1.19.4 本文介绍使用kubeadm安装Kubernetes集群的简单过程. 目录 使用kubeadm安装k8 ...
- 基于jQuery1.4.2轻量级的弹出窗口jQuery插件wBox 1.0
Box特点 背景透明度可以根据实际情况进行调节 可以根据需要添加wBox标题 支持callback函数 支持html内容自定义 支持在wBox显示#ID的内容 支持Ajax页面内容 支持iFrame ...
- 看动画轻松学会 Raft 算法
由于 Paxos 算法过于晦涩难懂且难以实现,Diego Ongaro 提出了一种更易于理解和实现并能等价于 Paxos 算法的共识算法 - Raft 算法. 因为 Raft 算法清晰易懂越来越多的开 ...