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 ...
随机推荐
- NoSQL性能测试:MongoDB VS SequoiaDB
作 为NoSQL的一个重要类型,文档型NoSQL通常被认为是最接近传统关系型数据库的NoSQL.文档型NoSQL的核心是数据嵌套,这种设计可以从某种 程度上大大简化传统数据库复杂的关联问题.同时由于摆 ...
- ACE_linux:Reactor与Proactor两种模式的区别
一.概念: Reactor与Proactor两种模式的区别.这里我们只关注read操作,因为write操作也是差不多的.下面是Reactor的做法: 某个事件处理器宣称它对某个socket上的读事件很 ...
- sublime 编辑完自动生成tmp的备份
是安装phptool之后造成的,卸载即可 http://bbs.csdn.net/topics/390826865
- 解决 windows2012 下无法安装 sql2008R2
Press the Windows logo key, type control panel, and then click the Control Panel icon. Note If you a ...
- 这个SpringMVC的一直刷屏的问题你见过吗?无解
严重: Servlet.service() for servlet DispatcherServlet threw exceptionjava.lang.StackOverflowError at o ...
- Gazebo Ros入门
教程代码 First step with gazebo and ros • setup a ROS workspace • create projects for your simulated rob ...
- unity3d KeyCode各键值说明
KeyCode :KeyCode是由Event.keyCode返回的.这些直接映射到键盘上的物理键. http://docs.unity3d.com/ScriptReference/KeyCode.h ...
- (转)Qt Model/View 学习笔记 (三)——Model类
Model类 基本概念 在model/view构架中,model为view和delegates使用数据提供了标准接口.在Qt中,标准接口QAbstractItemModel类中被定义.不管数据在底层以 ...
- 使用NPIO操作Excel
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...
- 慎用ReentrantLock
前言: 代码简洁与性能高效无法两全其美,本文章专注于并发程序的性能,如果您追求代码简洁,本文章可能不太适合,本文章属于Java Concurrency in Practice读书笔记. 在java5中 ...