「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 上传者: 匿名 题目描述 ...
随机推荐
- 在Vue中使用Echart图表库。【全网最简单】
使用npm安装echart npm install echarts --save 然后在使用的页面上直接import import echarts from "echarts"; ...
- GridView使用SimpleAdapter
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app=&q ...
- 【总结】HTTP
一.HTTP 1.http HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字.图片.音频.视频等超文本数 ...
- 2020 10月CUMTCTF wp
华为杯 × 签到杯√ 论比赛过程来说没什么很大收获 但看师傅们的wp感触很多 赛后复现慢慢学吧 Web babyflask flask ssti模板注入: payload{{key}}发现[]以及类似 ...
- 个人笔记docker
启动docker sudo systemctl start docker.service 暂停docker sudo systemctl stop docker.service 运行docke ...
- python机器学习之支持向量机SVM
支持向量机SVM(Support Vector Machine) 关注公众号"轻松学编程"了解更多. [关键词]支持向量,最大几何间隔,拉格朗日乘子法 一.支持向量机的原理 Sup ...
- 联发科Mediatek工业路由芯片上网稳定低功耗的Router模块WiFi中继——无线AP定制方案
Router模块又名路由器模块,是指将路由器的接口类型及部分扩展功能是可以根据实际需求来进行无线接入服务,允许其他无线设备接入,通过局域无线端或联网远程端,进行数据访问,对无线设备进行远程控制.常见的 ...
- centos 6.5 时间网络同步
安装 ntpdate sudo yum -y install ntp ntpdate 修改为上海时区 sudo vim /etc/sysconfig/clock ZONE = "Asia/S ...
- pytorch训练GAN时的detach()
我最近在学使用Pytorch写GAN代码,发现有些代码在训练部分细节有略微不同,其中有的人用到了detach()函数截断梯度流,有的人没用detch(),取而代之的是在损失函数在反向传播过程中将bac ...
- 揭秘仿比心app源码的开发背后,功能是如何实现的
约单陪玩系统作为最近兴起的开发热点,引起了竞相开发,其中比心源码可以说是行业内运营级别的APP中功能比较齐全的,那么仿比心app源码的功能是如何实现的呢,接下来就带大家简单分析一下. 仿比心app源码 ...