联赛%你测试10T2:漫无止境的八月
题意:
思路:
有几个特殊的性质:
- 在不考虑q里面的单点修改,我们先只判断一个序列是否Yes。
- 我们注意到每次操作都是对一个长度为k的区间进行区间加减1的操作,所以我们如果将序列里面的数按%k分组,把同一组的数都加在一起,那每次操作就一定是给每一个组都加上或减去一个1,因为连续的k长度中,一定是每一组都有且只有一个数受到处理。
- 因为我们自己的操作是区间加减,那么操作是可逆的,如果这个序列能变成全0的序列,那么他也一定可以由全0的序列转移过来,全0的序列每一组的和都是0,进行几次操作后,只会给每一组都加上或减去一些1。所以如果一个序列可以由全0序列转移来,那么它每一组数的和都一定相等。
- 加上单点修改后,会有什么改变呢?
- 很显然,会改变某一组的和。
- 如果改变后所有组的和都相等,那么输出Yes,否则输出No
- 这样\(O(n)\)查询显然不行,那我们稍微优化下。
- 我们开个桶,记录某一个值出现了几次,如果一个组的和是x,那么vis[x]++;如果一个值的vis是k,那么就说明所有组的和都一样,那么就输出yes啦。
- 在修改的时候,我们把修改前的这组和的vis值--,修改后的这组和vis值++,然后判断就好啦。
然后就完了吗???
当然不,区间和的值太大了,数组开不下。
有人会说:用map呀,map开的下。
map常数巨大,直接T飞(70分)。
- 有人会说:用unordered_map呀,O(1)查询总没问题吧
- 评测机没开c++11,根本用不了。
- unordered_map实测也会T。
- 所以这道题想通过这种方法a掉,就只剩两种方法了:
- 运用神仙快读fread()+强行预编译c++11
- 手打哈希表。
就没别的办法了吗???
当然有。
我们考虑差分(区间问题的一种可行性方法),先建出来差分数组。
每次修改是对i加一个值对i+k减去同一个值。
那我们再按%k分组求和,发现无论如何更改,每一组的和都是不变的(因为i和i+k在一组里)。
因为全0序列的差分数组每一组的和都是0,那么只要一个序列每一组和都是0,那就Yes。
一个特判:
我们发现原序列的最后一段区间n-k+1~n,通过差分数组的处理,是给n-k+1的位置上加一个值,再给n+1的位置上减一个值。但是n+1位置上是没有数的。所以我们得出一个惊人的事实:
n+1所在那个组的和是随便选的!!!
因为你修改这个组的数的时候,因为n+1这个位置上没有数,那就是随便选,那当然无论怎样这组的和都可以看作0。
我自己的口胡证明:
n+1这一组之所以特殊,是因为这一组的最后一项chafen[n-k+1]的修改比较特殊,我们在处理原序列的最后一段n-k+1~n这一段时候,对应到差分数组上是只给chafen[n-k+1]进行加减的,而其他的区间都是前面加上一个,后面再减回去一个。所以我们可以认为,无论原序列如何,可以做到只更改chafen[n-k+1]而不对其他的差分数组的值产生影响,那么无论这一组差分数组的和是多少,我们可以通过人为调控chafen[n-k+1]的值使得这一组的和最后变为0。因此,这一组的和是任取的。
所以询问一个区间是否Yes,只要看它差分后的所有组(除了n+1那组)是不是和都是0即可。
我的做法deepinc&skyh学长的处理方法是:
- 先扫一遍给的序列,算出差分数组。记录每组和,如果有某组和不是0,那么cnt++。如果扫完后cnt==0就Yes否则就No。(需特判n+1%k这组)
- 每次单点修改,就是对pos所在的组加上一个数,对pos+1所在的组减去一个数(差分数组的性质)
- 如果有一个组的和由非0变成了0那么cnt--,如果一个组的和由0变成了非0,那么cnt++。每一个修改过后,直接看cnt==0就Yes。(注意:如果pos或pos+1所在的组有在n+1%k那组的,那这一组就不用处理上面的这些了)
附上丑码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e6+10;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int a[maxn],chafen[maxn],num[maxn];
int n,k,q;
int main(){
freopen("august.in","r",stdin);
freopen("august.out","w",stdout);
n=read();k=read();q=read();
for(register int i=1;i<=n;i++){
a[i]=read();
}
for(register int i=1;i<=n;i++){
chafen[i]=a[i]-a[i-1];
}
for(register int i=1;i<=n;i++){
num[i%k]+=chafen[i];
}
int ignore=(n+1)%k;
int cnt=0;
for(register int i=0;i<k;i++){
if(num[i]){
cnt++;
}
}
if(num[ignore])cnt--;
if(!cnt)puts("Yes");else puts("No");
for(register int i=1;i<=q;i++){
int pos,x;
pos=read();
x=read();
if(pos%k!=ignore){
if(num[pos%k]==0&&num[pos%k]+x!=0)cnt++;
if(num[pos%k]!=0&&num[pos%k]+x==0)cnt--;
num[pos%k]+=x;
}
if((pos+1)%k!=ignore){
if(num[(pos+1)%k]==0&&num[(pos+1)%k]-x!=0)cnt++;
if(num[(pos+1)%k]!=0&&num[(pos+1)%k]-x==0)cnt--;
num[(pos+1)%k]-=x;
}
if(!cnt)puts("Yes");else puts("No");
}
return 0;
}
联赛%你测试10T2:漫无止境的八月的更多相关文章
- csps模拟9495凉宫春日的忧郁,漫无止境的八月,简单计算,格式化,真相题解
题面:https://www.cnblogs.com/Juve/articles/11767239.html 94,95的T3都没改出来,是我太菜了... 凉宫春日的忧郁: 比较$x^y$和$y!$的 ...
- 联赛模拟测试5 涂色游戏 矩阵优化DP
题目描述 分析 定义出\(dp[i][j]\)为第\(i\)列涂\(j\)种颜色的方案数 然后我们要解决几个问题 首先是求出某一列涂恰好\(i\)种颜色的方案数\(d[i]\) 如果没有限制必须涂\( ...
- 联赛模拟测试8 Dash Speed 线段树分治
题目描述 分析 对于测试点\(1\).\(2\),直接搜索即可 对于测试点\(3 \sim 6\),树退化成一条链,我们可以将其看成序列上的染色问题,用线段树维护颜色相同的最长序列 对于测试点\(7\ ...
- 联赛模拟测试10 C. 射手座之日
题目描述 分析 方法一(线段树) 线段树维护的是以当前节点为左端点的区间的贡献 而区间的右端点则会从 \(1\) 到 \(n\) 逐渐右移 当我们把右端点从 \(i-1\) 的位置扩展到 \(i\) ...
- 联赛模拟测试12 C. sum 莫队+组合数
题目描述 分析 \(80\) 分的暴力都打出来了还是没有想到莫队 首先对于 \(s[n][m]\) 我们可以很快地由它推到 \(s[n][m+1]\) 和 \(s[n][m-1]\) 即 \(s[n] ...
- 联赛模拟测试12 B. trade
题目描述 分析 \(n^2\) 的 \(dp\) 应该比较好想 设 \(f[i][j]\) 为当前在第 \(i\) 天剩余的货物数量为 \(j\) 时的最大收益 那么它可以由 \(f[i-1][j]\ ...
- 联赛模拟测试14 A. 虎
题目描述 这题太虎了,所以没有背景. 给你一棵树,边有黑白两种颜色,你每次可以选择两个点,把这两个点之间的唯一简单路径上的所有边颜色取反,某些边要求最终颜色必须是黑色,还有些边没有要求,问最少操作多少 ...
- 联赛模拟测试17 A. 简单的区间 启发式合并
题目描述 分析 我们要找的是一段区间的和减去该区间的最大值能否被 \(k\) 整除 那么对于一段区间,我们可以先找出区间中的最大值 然后枚举最大值左边的后缀与最大值右边的前缀之和是否能被 \(k\) ...
- 联赛模拟测试18 A. 施工 单调队列(栈)优化DP
题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ...
随机推荐
- RabbitMQ和Kafka的高可用集群原理
前言 小伙伴们,通过前边文章的阅读,相信大家已经对RocketMQ的基本原理有了一个比较深入的了解,那么大家对当前比较常用的RabbitMQ和Kafka是不是也有兴趣了解一些呢,了解的多一些也不是坏事 ...
- pyhton:time模块和datetime模块
一.time模块 1.相关定义: time模块时间的表达有3种,时间戳,时间元祖,格式化时间 #时间戳: print(time.time())#获取当前时间戳.时间戳的计算是1970纪元后经过的浮点秒 ...
- Azure技术系列之Redis篇---第一章数据缓存
嘈杂和忙碌的生活占据占据了生活的每一天,好久没有静下心来对自己喜欢的技术进行归纳总结了.痛定思痛,今天开始开荒,把之前研究的技术进行归纳总结,先从Azure的Redis的开发技术开始. Azure 的 ...
- Eclipse安装Mat工具分析教程
一.关于Mat MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.MAT是基于Eclipse开发的,是一款免费的性能分析工 ...
- 微信小程序-组件-视图容器
1.view 1.作用:类似 html 的 div 用来进行页面布局,具有块级盒子特性. 2.常用属性:设置view盒子点击后的状态,以及控制是否影响父盒子的点击状态 3.eg:<view ho ...
- JAVA热部署,通过agent进行代码增量热替换!!!
在前说明:好久没有更新博客了,这一年在公司做了好多事情,包括代码分析和热部署替换等黑科技,一直没有时间来进行落地写出一些一文章来,甚是可惜,趁着中午睡觉的时间补一篇介绍性的文章吧. 首先热部署的场景是 ...
- Dos拒绝服务Sockstress/TearDrop 泪滴攻击(二)
Sockstress放大攻击原理:攻击者向目标发送一个很小的流量,但是会造成产生的攻击流量是一个巨大的.成百上千倍上万倍流量被放大的一个效果,才适合作为一个拒绝服务攻击效果.(实现攻击者很小的流量打垮 ...
- ES6重度学习 demo实例
let 与 const // 并非真正的常量 // const 的本质: const 定义的变量并非常量,并非不可变, // 它定义了一个常量引用一个值.使用 const 定义的对象或者数组,其实是可 ...
- Axios源码深度剖析
Axios源码深度剖析 - XHR篇 axios 是一个基于 Promise 的http请求库,可以用在浏览器和node.js中,目前在github上有 42K 的star数 分析axios - 目录 ...
- hystrix文档翻译之metrics
metrics和监控 动机 HystrixCommands和HystrixObservableCommands执行过程中会产生相关运行情况的metrics.这些metrics对于监控系统表现有很大的 ...