一眼分块题……

分块,维护每个块的总的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的更多相关文章

  1. 【BZOJ4028】[HEOI2015]公约数数列(分块)

    [BZOJ4028][HEOI2015]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(g ...

  2. [BZOJ4028][HEOI2015]公约数数列(分块)

    先发掘性质: 1.xor和gcd均满足交换律与结合率. 2.前缀gcd最多只有O(log)个. 但并没有什么数据结构能同时利用这两个性质,结合Q=10000,考虑分块. 对每块记录这几个信息: 1.块 ...

  3. BZOJ4028 HEOI2015公约数数列(分块)

    前缀gcd的变化次数是log的,考虑对每一种gcd查询,问题变为查询一段区间是否存在异或前缀和=x/gcd. 无修改的话显然可以可持久化trie,但这玩意实在没法支持修改.于是考虑分块. 对于每一块将 ...

  4. 【BZOJ4028】[HEOI2015]公约数数列 分块

    [BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. M ...

  5. bzoj4028: [HEOI2015]公约数数列

    Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x ...

  6. [BZOJ4028][HAOI2015]公约数数列[分块+分析暴力]

    题意 题目链接 分析 首先明确 \(xor\) 运算和 \(\rm gcd\) 没有联系! 注意到一个数字取 \(\rm gcd\) 且保证每次取 \(\rm gcd\) 值都会变小的话,最多取 \( ...

  7. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

随机推荐

  1. memcache的一致性hash算法

    <?php /** * 一致性哈希memcache分布式,采用的是虚拟节点的方式解决分布均匀性问题,查找节点采用二分法快速查找 * the last known user to change t ...

  2. CorelDRAW 文件实用工具 CDRTools 2

    随着 CorelDRAW 更新脚步越来越频繁,版本之间兼容性问题越来越突出,特别是跨版本之间打开会有很多问题,比如:文字跑位.透镜变向.位图出错.颜色改变,甚至会造成文件损坏.最好的办法就是哪一个版本 ...

  3. max_size, capacity and size 的区别

    The max_size() function returns the maximum number of elements that the container can hold. The max_ ...

  4. WP-PostViews Plus停止计数

    最近老是发现WP-PostViews Plus停止计数,网上查了资料才发现,WP Super Cache和WP-PostViews Plus存在冲突.根据自己网站目前的情况看,暂时用不到WP Supe ...

  5. 每日一记:搭建Memcached + php 缓存系统

    服务器环境,Centos6.5 1.安装Memcached服务端 Yum -y install memcached 2.配置Memcached服务端用户以及自动启动服务等 将服务配置成自启动 chkc ...

  6. Linux配置Tomcat(转载)

    转载自:http://www.cnblogs.com/zhoulf/archive/2013/02/04/2891633.html 安装说明 安装环境:CentOS-6.3安装方式:源码安装 软件:a ...

  7. chm文件打开,有目录没有内容

    下载下来的一些chm文件,打开的是否提示“打开此文件前总是询问”,不理睬直接打开后,只有目录,页面内容都显示“已取消到本页的导航”.原因是该CHM文件的发行商未知,将“打开此文件前总是询问”选项取消后 ...

  8. dive into python 读笔(1)

    chapter2 and 3: 使用Python IDE来交互式地测试表达式 编写Python程序并且从IDE运行,或者从命令行运行 导入模块及调用它们的函数 声明函数以及doc string.局部变 ...

  9. ubuntu下安装GTK过程

    GTK的安装过程比较繁琐,以前也安装过,但没有记录下来,Google一下记录下来备用. 利用此方法成功在ubuntu12.04下安装GTK 2.24.10 1.安装gcc/g++/gdb/make 等 ...

  10. wget 下载百度云jdk

    oracle官网下载需要登录下载 所以从百度云下载 wget -c -O "URL"