bzoj4028
一眼分块题……
分块,维护每个块的总的gcd和xor和
先思考我们应该怎么查询,考虑到gcd是一个神奇的东西,因为它最多变化logX次
于是我们从前往后扫描每个块,如果一个块内总的gcd是当前扫描的前缀gcd的倍数
那么,也就意味着这个块里的每个位置所对应的前缀的gcd都等于当前gcd
因此,我们设当前xor和为nowxor,gcd为nowgcd,partxor为块内某个块前缀xor和
nowxor xor partxor*nowgcd=x 即 nowxor xor (x/nowgcd)=partxor
这时候只要查询块内是否存在某个块前缀xor和为nowxor xor (x/nowgcd)即可,这我们可以用hash解决
如果不是倍数关系,那么我们直接暴力这个块即可,这样的暴力一定不会超过logX次
至于修改,我们直接暴力重构对应块即可
const mo=;
type node=record
po,num,next:longint;
end; var e:array[..] of node;
p:array[..,..mo] of longint;
a,g,b,be:array[..] of longint;
size,t,len,i,j,n,m,x,y:longint;
z:int64;
ch:char;
s:string; function gcd(a,b:longint):longint;
begin
if b= then exit(a)
else exit(gcd(b,a mod b));
end; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure work(x,y,z:longint);
var i,j:longint;
begin
i:=p[x,y mod mo];
while i<> do
begin
j:=e[i].po;
if e[i].po=y then
begin
e[i].num:=min(e[i].num,z);
exit;
end;
i:=e[i].next;
end;
inc(len);
e[len].po:=y;
e[len].num:=z;
e[len].next:=p[x,y mod mo];
p[x,y mod mo]:=len;
end; procedure del(x,y,z:longint);
var i,j:longint;
begin
i:=p[x,y mod mo];
while i<> do
begin
j:=e[i].po;
if e[i].po=y then
begin
if e[i].num=z then e[i].num:=n+;
exit;
end;
i:=e[i].next;
end;
end; function get(x,y:longint):longint;
var i,j:longint;
begin
i:=p[x,y mod mo];
while i<> do
begin
j:=e[i].po;
if j=y then exit(e[i].num);
i:=e[i].next;
end;
exit(n+);
end; function ask(x:int64):longint;
var tg,tx,i,j,r,p:longint;
begin
tg:=; tx:=;
for i:= to size do
begin
tg:=gcd(tg,a[i]);
tx:=tx xor a[i];
if int64(tg)*int64(tx)=x then exit(i);
if x div int64(tg)> shl then exit(-);
end;
for i:= to t do
begin
if x div int64(tg)> shl then exit(-);
if i=t then r:=n else r:=i*size;
if g[r] mod tg= then
begin
if x mod tg= then
begin
p:=get(i,tx xor (x div int64(tg)));
if p<=n then exit(p);
end;
tx:=tx xor b[r];
end
else begin
for j:=(i-)*size+ to r do
begin
tg:=gcd(tg,a[j]);
tx:=tx xor a[j];
if int64(tg)*int64(tx)=x then exit(j);
if x div int64(tg)> shl then exit(-);
end;
end;
end;
exit(-);
end; begin
readln(n);
size:=trunc(sqrt(n));
for i:= to n do
begin
read(a[i]);
be[i]:=(i-) div size+;
end;
t:=n div size;
if n mod size<> then inc(t);
for i:= to n do
begin
if i mod size= then
begin
g[i]:=a[i];
b[i]:=a[i];
end
else begin
b[i]:=b[i-] xor a[i];
g[i]:=gcd(g[i-],a[i]);
end;
work(be[i],b[i],i);
end;
readln(m);
for i:= to m do
begin
s:='';
read(ch);
while ch<>' ' do
begin
s:=s+ch;
read(ch);
end;
if s[]='M' then
begin
readln(x,y);
inc(x);
a[x]:=y;
for j:=x to min(size*be[x],n) do
begin
del(be[x],b[j],j);
if j mod size= then
begin
b[j]:=a[j];
g[j]:=a[j];
end
else begin
b[j]:=b[j-] xor a[j];
g[j]:=g[j-] xor a[j];
end;
work(be[x],b[j],j);
end;
end
else begin
readln(z);
x:=ask(z);
if x=- then writeln('no') else writeln(x-);
end;
end;
end.
bzoj4028的更多相关文章
- 【BZOJ4028】[HEOI2015]公约数数列(分块)
[BZOJ4028][HEOI2015]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(g ...
- [BZOJ4028][HEOI2015]公约数数列(分块)
先发掘性质: 1.xor和gcd均满足交换律与结合率. 2.前缀gcd最多只有O(log)个. 但并没有什么数据结构能同时利用这两个性质,结合Q=10000,考虑分块. 对每块记录这几个信息: 1.块 ...
- BZOJ4028 HEOI2015公约数数列(分块)
前缀gcd的变化次数是log的,考虑对每一种gcd查询,问题变为查询一段区间是否存在异或前缀和=x/gcd. 无修改的话显然可以可持久化trie,但这玩意实在没法支持修改.于是考虑分块. 对于每一块将 ...
- 【BZOJ4028】[HEOI2015]公约数数列 分块
[BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. M ...
- bzoj4028: [HEOI2015]公约数数列
Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x ...
- [BZOJ4028][HAOI2015]公约数数列[分块+分析暴力]
题意 题目链接 分析 首先明确 \(xor\) 运算和 \(\rm gcd\) 没有联系! 注意到一个数字取 \(\rm gcd\) 且保证每次取 \(\rm gcd\) 值都会变小的话,最多取 \( ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
随机推荐
- Implement Custom Cache Dependencies in ASP.NET 1.x
Code download available at:CuttingEdge0407.exe(128 KB) Contents What's a Cache Dependency, Anyway? ...
- js替换字符串的所有示例代码
js如何替换字符串中所有. /** * 替换字符串中所有 * @param obj 原字符串 * @param str1 替换规则 * @param str2 替换成什么 * @return 替换后的 ...
- 在emacs里用w3m浏览网页
给w3m配置个~/.emacs老是暴错误,在配置里把这个注掉就OK了;(require 'mime-w3m) ;;支持w3m (add-to-list 'load-path "/usr/sh ...
- 辛星Spring4.x教程开放下载了
下载地址: https://pan.baidu.com/s/1kVSAYeb
- RichTextBox控件-主要用于输入输出编辑文本信息
1.在RichTextBox控件中添加超链接文字 private void btn_Add_Click(object sender, EventArgs e) { rtbox_HyperLink.Ap ...
- 在百万数据中找出重复的数据sql
select * from (select count(name) as isone, name from tbl_org_departments group by name) t where t.i ...
- Linux Mint SmoothTask2的安装方法
首先,先下载smooth task:点击这里下载 下载之后解压缩,里面有个install文件,点击打开: To install plasmoid unpack archive, go to the d ...
- 1305: [CQOI2009]dance跳舞 - BZOJ
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- C#查找子串在原串中出现次数
提供的是一种思路,和具体语言无关. string test = "good good study day day up"; string r = test.Replace(&quo ...
- jquery下拉列表选中项改变时获取新选项的属性值
$("#textSel").change(funtion(){ var selVal=$(this).val(); var selText=$("#textSel opt ...