「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 上传者: 匿名 题目描述 ...
随机推荐
- Java数据结构-01顺序表
一.定义 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列. 二.存储分类 1.顺序存储: ①简述:是指将线性表中的各个元素依次存放在一组地址连续的存储单元中,通常将这种方 ...
- map+area标签
map标签是用于定义一个客户端的图像映射即带有可点击区域的一幅图像,配合area标签 area 元素永远嵌套在 map 元素内部.area 元素可定义图像映射中的区域 例:要实现一幅地图上鼠标点击或者 ...
- 机器学习 第4篇:sklearn 最邻近算法概述
sklearn.neighbors 提供了针对无监督和受监督的基于邻居的学习方法的功能.监督的基于最邻近的机器学习算法是值:对带标签的数据的分类和对连续数据的预测(回归). 无监督的最近算法是许多其他 ...
- php 计算2点之间的距离
//获取该点周围的4个点 $distance = 1;//范围(单位千米) $lat = 113.873643; $lng = 22.573969; define('EARTH_RADIUS', 63 ...
- (二)http请求方法和状态码
1.HTTP请求方法 根据 HTTP 标准,HTTP 请求可以使用多种请求方法. HTTP1.0 定义了三种请求方法: GET.POST 和 HEAD方法. HTTP1.1 新增了六种请求方法:OPT ...
- Exception in MIPS
介绍 分支.跳转.异常(包括硬件中断)是三种改变控制流的事件. 同步异常是指程序执行到固定位置必定触发且每次现象一致的异常,如算术溢出异常.未定义指令异常.缺页异常等. 异步异常与当前执行程序无关,如 ...
- 20181301刘天宁 MyOD
一.题目要求: 1.复习c文件处理内容编写myod.c 2.用myod XXX实现Linux下od -tx -tc XXX的功能 3.main与其他分开,制作静态库和动态库 4.编写Makefile ...
- 百度地图省市php获取
$api = 'http://api.map.baidu.com/shangquan/forward/?qt=sub_area_list&ext=1&level=3&areac ...
- .net core mvc appsettings.json配置文件的使用
配置文件的使用主要是两种用法 1.直接使用弱类型的数据 2.使用强类型的数据 (将配置的数据映射到类) 直接使用弱类型的数据 在appsetings.json文件中先新建两个节点 TestObj节点 ...
- 手机运行Linux系统,可以办公,可以上网,太爽了!
之前用 Termux 编程一直都是在黑乎乎的命令行敲代码,有多少人知道其实可以在手机上用 Termux 构建一个包含桌面环境的 Linux 系统呢. 这个构建出的 linux 系统,可以显示出桌面,可 ...