一眼分块题……

分块,维护每个块的总的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. js 根据当前星期做跳转(代码段)

    var week = [6,0,1,2,3,4,5]; $('.HotShop_head .HotShop_tab:eq('+week[new Date().getDay()]+')').click( ...

  2. PHP5 GD库生成图形验证码(汉字)

    PHP5 GD库生成图形验证码且带有汉字的实例分享. 1,利用GD库函数生成图片,并在图片上写指定字符imagecreatetruecolor 新建一个真彩色图像imagecolorallocate ...

  3. DataSnap Demo:TFDConnection、最大连接数、客户端回叫功能、多线程模拟、压力测试等

    一.限制最大连接数,并验证来访者用户身份: procedure TServerContainer1.DSServer1Connect( DSConnectEventObject: TDSConnect ...

  4. Django文档——Model字段类型(Field Types)

    大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...

  5. 1090. Highest Price in Supply Chain (25)

    时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A supply chain is a network of r ...

  6. gc overhead limit exceeded

    eclipse-- gc overhead limit exceeded 修改内存不足的方法如下: Eclipse报错:gc overhead limit exceeded eclipse 原因是Ec ...

  7. Asp.net MVC入门视频教程

    编程开发 > Asp.net视频教程 > Asp.net MVC入门视频教程 > 1.传统web处理方式和mvc处理方式 上传日期:2014-08-16 10:02:45  相关摘要 ...

  8. Unity3d + UGUI 的多分辨率适配

    原文地址:http://blog.csdn.net/dingkun520wy/article/details/49471789 1.Canvas的属性配置 2.Canvas Scaler的属性配置 3 ...

  9. iOS10 权限崩溃问题-b

    手机升级了 iOS10 Beta,然后用正在开发的项目 装了个ipa包,发现点击有关 权限访问 直接Crash了,并在控制台输出了一些信息: This app has crashed because ...

  10. HDFS入门详解

    一. 前提和设计目标 1. 硬件错误是常态,因此需要冗余,这是深入到HDFS骨头里面去了 HDFS可能由成百上千的服务器所构成,每个服务器上存储着文件系统的部分数据.我们面对的现实是构成系统的组件数目 ...