「LOJ #6500」「雅礼集训 2018 Day2」操作
description
solution
根据常有套路,容易想到将区间差分转化为异或数组上的单点修改,即令\(b_i=a_i \ xor\ a_{i-1}\),
那么将\([l,l+k-1]\)取反,就相当于将\(b[l]\)与\(b[l+k]\)取反,若\(b[l]\)与\(b[l+k]\)都是1,等于是二者消掉了
于是发现一次操作只会对\(mod k\)余数相同的位置造成影响,并且每次操作只能消去两个1,
故区间\([l,r]\)的\(b\)数组能全部变成0当且仅当这段区间内的所有位置按\(mod k\)的余数分组后,每组中都有偶数个1
处理这样的情况有一个常见套路,那就是给\(mod k\)的每个余数分配一个随机数哈希值,那么一段区间中若\(mod k=r\)的位置中有偶数个1,那么异或起来就会变成0
故区间\([l,r]\)的\(b\)数组能全部变成0当且仅当这段区间内的异或和为0
考虑如何求操作次数,容易想到将最优方案是对于每个剩余系,将相邻的2个1配对
于是对于一个\(mod k=r\)的剩余系,设剩余系内所有位置从小到大分别为\(a_1,a_2,⋯,a_{2k−1},a_{2k}\),那么答案就是\(\frac{(a_2−a_1)+(a_4−a_3)+⋯+(a_{2k}−a_{2k−1})}{k}\)。
我们可以预处理这个式子的前缀和,因为从左至右依次处理时,每一个剩余系内从右至左的第奇数个位置有正的贡献,第偶数个有负的贡献,于是新加入一个\(i\)就会导致之前的贡献全部取反再加上\(i\)的贡献
于是再特殊处理一下边界就行了
code
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=2e6+10;
int n,k,m,a[N],dis[N],d[N],L[N],R[N];
ull hsh[N],sum[N];
char s[N];
int main(){
scanf("%d%d%d",&n,&k,&m);
scanf("%s",s+1);
for(int i=0;i<k;++i) hsh[i]=rand()*rand();
for(int i=1;i<=n;++i){
a[i]=s[i]-'0';
sum[i]=sum[i-1];dis[i]=dis[i-1];
if(a[i]^a[i-1]){
sum[i]^=hsh[i%k];
dis[i]+=-(d[i%k]<<1)+i;
d[i%k]=i-d[i%k];
}
L[i]=d[i%k];
R[i]=d[(i+1)%k];
}
for(int i=1,l,r;i<=m;++i){
scanf("%d%d",&l,&r);
ull hsht=sum[l]^sum[r]^(a[l]*hsh[l%k])^(a[r]*hsh[(r+1)%k]);
if(hsht!=0) puts("-1");
else{
int ret=dis[r]-dis[l];
if(a[l]==1) ret-=l-(L[l]<<1);
if(a[r]==1) ret+=r+1-(R[r]<<1);
printf("%d\n",ret/k);
}
}
return 0;
}
「LOJ #6500」「雅礼集训 2018 Day2」操作的更多相关文章
- 【卡常 bitset 分块】loj#6499. 「雅礼集训 2018 Day2」颜色
好不容易算着块大小,裸的分块才能过随机极限数据:然而这题在线的数据都竟然是构造的…… 题目描述 有 $n$ 个数字,第 $i$ 个数字为 $a_i$. 有 $m$ 次询问,每次给出 $k_i$ 个区间 ...
- 「雅礼集训 2018 Day2」农民
传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...
- LOJ6500. 「雅礼集训 2018 Day2」操作(哈希+差分)
题目链接 https://loj.ac/problem/6500 题解 区间取反 \(01\) 串的经典套路是差分.我们令 \(b_i = a_i\ {\rm xor}\ a_{i - 1}\)(\( ...
- #6499. 「雅礼集训 2018 Day2」颜色 [分块,倍增,bitset]
bitset压位,因为是颜色数,直接倍增,重合部分不管,没了. // powered by c++11 // by Isaunoya #include <bits/stdc++.h> #d ...
- 【LOJ6498】「雅礼集训 2018 Day2」农民
题面 solution 直接暴力模拟,原数据可获得满分的成绩. 对于每个点,其父亲对其都有一个限制.故我们只需要判断当前点到根的路径上的限制是否都能满足即可. 考虑用树剖+线段树维护这个限制.考虑到翻 ...
- Loj #6503. 「雅礼集训 2018 Day4」Magic
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
- 「雅礼集训 2017 Day2」解题报告
「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...
- #6034. 「雅礼集训 2017 Day2」线段游戏 李超树
#6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...
- 【loj6034】「雅礼集训 2017 Day2」线段游戏
#6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...
随机推荐
- h5 返回上一页面方法
//以下方法仅供参考1.返回上一页,不刷新history.html window.history.go(-1); javascript:window.history.go(-1) 2.返回上一页并刷 ...
- 平时查询linux服务器与应用版本
###JDK版本###java -version ##Tomcat环境版本###进入到tomcat目录的bin下./version.sh ###服务器###(1)osuname -a 查看releas ...
- Linux常用命令合集(一)
1.处理目录的常用命令: ls(英文全拼:list files): 列出目录及文件名 cd(英文全拼:change directory):切换目录 pwd(英文全拼:print work direct ...
- Redis---06主从复制(薪火相传)
一.什么是薪火相传模式 上一个slave(从机)是下一个slave(从机)的Master(主机) 二.为什么要这样 优点:从机同样可以接收其他从机的连接和同步请求,那么该从机作为了链条中下一个的主机, ...
- C 语言编程习惯总结
笔者能力有限,如果文中出现错误的地方,还请各位朋友能够给我指出来,我将不胜感激,谢谢~ 引言 编程习惯的培养需要的是一个长期的过程,需要不断地总结,积累,并且我们需要从意识上认识其重要性,一个良好的编 ...
- java安全编码指南之:序列化Serialization
目录 简介 序列化简介 注意serialVersionUID writeObject和readObject readResolve和writeReplace 不要序列化内部类 如果类中有自定义变量,那 ...
- STM32入门系列-GPIO概念介绍
GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出.STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯 ...
- python使用zlib库压缩图片,使用ffmpeg压缩视频
python压缩图片.视频 图片压缩使用zlib库 视频压缩使用工具ffmpeg # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -p ...
- MySQL安装及安装问题解答(二)
在安装过程中难免会有一些异常情况出现,笔者对一部分异常情况做出解答以供参考 1.MySQL未能成功启动 在输入net start mysql后提示 MySQL 服务正在启动, MySQL 服务无法启动 ...
- Spring源码笔记
Spring Version:5.1.12 ApplicationContext 常用的实例化方式: ClassPathXmlApplicationContext FileSystemXmlAppli ...