任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=4028

4028: [HEOI2015]公约数数列

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 1177  Solved: 456
[Submit][Status][Discuss]

Description

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

1. MODIFY id x: 将 a_{id} 修改为 x.
2. QUERY x: 求最小的整数 p (0 <= p < n),使得 gcd(a_0, a_1, ..., a_p) * XOR(a_0, a_1, ..., a_p) = x. 其中 XOR(a_0, a_1, ..., a_p) 代表 a_0, a_1, ..., a_p 的异或和,gcd表示最大公约数。

Input

输入数据的第一行包含一个正整数 n.

接下来一行包含 n 个正整数 a_0, a_1, ..., a_{n - 1}.
之后一行包含一个正整数 q,表示询问的个数。
之后 q 行,每行包含一个询问。格式如题目中所述。

Output

对于每个 QUERY 询问,在单独的一行中输出结果。如果不存在这样的 p,输出 no.

Sample Input

10
1353600 5821200 10752000 1670400 3729600 6844320 12544000 117600 59400 640
10
MODIFY 7 20321280
QUERY 162343680
QUERY 1832232960000
MODIFY 0 92160
QUERY 1234567
QUERY 3989856000
QUERY 833018560
MODIFY 3 8600
MODIFY 5 5306112
QUERY 148900352

Sample Output

6
0
no
2
8
8

HINT

对于 100% 的数据,n <= 100000,q <= 10000,a_i <= 10^9 (0 <= i < n),QUERY x 中的 x <= 10^18,MODIFY id x 中的 0 <= id < n,1 <= x <= 10^9.

解题思路:

暴力出奇迹。

这种蜜汁区间查询的考虑莫队或者分块。

当然这里是分块啦,在线动态更新嘛。

每一块维护的信息有:

①:Xor[ i ] 位置 i 到它所在块的最左端的异或前缀和。

②:Gcd[ i ] 位置 i 到 它所在块的最左端的前缀GCD。

为什么这样维护前缀GCD呢?因为区间 【1~N】 的前缀GCD 肯定是递减的,,而且每次减小最少都是除以2,那么GCD的种类 最多也是logN。

由于前缀GCD是递减的,那么如果 加上一块的数据后GCD不变,那就说明这一块里所有数的前缀GCD都是不变的。

那么暴力寻解的时候我们分两类情况讨论:

一类是加上这块后 GCD不变,那么只要查询这一块里面有没有符合条件的 异或前缀和即可,(这里预处理时 hash 一下,代码用了stl里的set),查询时直接查这一块的 hash 表即可。

一类是加上这一块后GCD改变的,暴力枚举啦 logN

AC code:

 #include <bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 1e5+;
int N, M;
int bl[], br[], pos[MAXN], block, num;
int Gcd[MAXN], Xor[MAXN];
int a[MAXN];
set<int>S[];
int gcd(int a, int b) {return b==?a:gcd(b, a%b);}
void build(int t)
{
S[t].clear();
Gcd[bl[t]] = a[bl[t]]; Xor[bl[t]] = a[bl[t]];
S[t].insert(Xor[bl[t]]);
for(int i = bl[t]+; i <= br[t]; i++){
Gcd[i] = gcd(Gcd[i-], a[i]);
Xor[i] = Xor[i-]^a[i];
S[t].insert(Xor[i]);
}
} int main()
{
int id, val;
scanf("%d", &N);
for(int i = ; i <= N; i++){
scanf("%d", &a[i]);
} block = (int)sqrt(N);
for(int i = ; i <= N; i+=block){
bl[++num] = i; br[num] = min(N,i+block-);
for(int j = bl[num]; j <= br[num]; j++)
pos[j] = num;
} for(int i = ; i <= num; i++) build(i); char com[];
scanf("%d", &M);
while(M--){
scanf("%s", com);
if(com[] == 'M'){
scanf("%d %d", &id, &val);
a[++id] = val;
build(pos[id]);
}
else{
LL xx = ;
int Lxor = , Lgcd = ;
scanf("%lld", &xx);
int flag = ;
for(int i = ; i <= num; i++){
int T = gcd(Lgcd, Gcd[br[i]]);
if(T != Lgcd){
for(int j = bl[i]; j <= br[i]; j++)
if((LL)gcd(Lgcd, Gcd[j])*(LL)(Xor[j]^Lxor) == xx){
flag = j;
break;
}
if(flag) break;
}
else{
if(xx%T == && S[i].count((int)(xx/T)^Lxor)){
for(int j = bl[i]; j <= br[i]; j++){
if((LL)gcd(Lgcd, Gcd[j])*(LL)(Xor[j]^Lxor) == xx){
flag = j;
break;
}
}
}
if(flag) break;
}
Lgcd = T; Lxor^=Xor[br[i]];
}
if(flag == ) puts("no");
else printf("%d\n", flag-);
}
}
return ;
}

BZOJ 4028: [HEOI2015]公约数数列 【分块 + 前缀GCD】的更多相关文章

  1. BZOJ 4028: [HEOI2015]公约数数列 分块

    4028: [HEOI2015]公约数数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4028 Description 设计一个数据结 ...

  2. bzoj 4028 : [HEOI2015]公约数数列

    之前看了好几次都没什么思路,今天下定决心把这题切了. 观察到$0-x$的gcd最多变化log次,因为它每次变化一定至少要去掉一个质因子,所以我们可以枚举gcd. 因为数据范围比较小,所以想到了分块. ...

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

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

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

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

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

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

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

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

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

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

  8. luogu P4108 [HEOI2015]公约数数列——solution

    -by luogu 不会啊.... 然后%了一发题解, 关键是 考虑序列{$a_n$}的前缀gcd序列, 它是单调不升的,且最多只会改变$log_2N$次,因为每变一次至少除2 于是,当我们询问x时: ...

  9. [HEOI2015]公约数数列

    不错的分块题 gcd和xor其实并没有联系 这里,xor的按位性质没有半点卵用 gcd的性质却很关键: 一个数组,前缀gcd最多logn个不同的 gcd不太多,(暴力的基础) 所有考虑分块. 分块,每 ...

随机推荐

  1. XmlSerialize

    以前配置文件都直接写在TXT文件,能看懂就行: 后来写了点代码,就把配置写在ini文件里: 再后来随着趋势就把配置类序列化到本地,即xml配置: 现在懒了,直接ToJson到本地,需要时FromJso ...

  2. Shiro - 关于session

    Shiro Session session管理可以说是Shiro的一大卖点. Shiro可以为任何应用(从简单的命令行程序还是手机应用再到大型企业应用)提供会话解决方案. 在Shiro出现之前,如果我 ...

  3. 预防XSS方法:HtmlEncode和JavaScriptEncode(转)

    XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入 ...

  4. Windows 10 搭建Hadoop平台

    一.环境配置 JDK:1.8. Hadoop下载地址(我选择的是2.7.6版本):https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/ ...

  5. Java 基础(5)——数据转换 & 特殊的引用类型

    数据转换 变量在第(3)篇中有讲到过八种数据类型,分别是能够用来表示整型的 byte.short.int.long 和表示浮点型的 float.double 以及字符型 char.布尔型 boolea ...

  6. Java基础(十一)集合框架

    一.集合框架 1.集合框架定义 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常 ...

  7. @media print样式 关于table断页

    <html> <head> <style> @media print { table { page-break-after:auto } tr { page-bre ...

  8. wampserver 点击跳转localhost变0.0.0.0的解决方法!

    最近下载新版本wampserver发现点击项目不会自动添加localhost了,导致访问项目很麻烦. 修改如下 修改wamp根目录下的wampmanager.conf urlAddLocalhost ...

  9. 解决方案看起来是受源代码管理,但无法找到它的绑定信息。保存解决方案的源代码管理设置的MSSCCPRJ.SCC文件或其他项可能己被删除。

    Visual Studio 2015 + SVN 开发环境,今天打开项目,就报了下面这个错误,先前是好好的! 解决方案看起来是受源代码管理,但无法找到它的绑定信息.保存解决方案的源代码管理设置的MSS ...

  10. Codeforces Round #414 A. Bank Robbery

    A. Bank Robbery time limit per test 2 seconds memory limit per test   256 megabytes   A robber has a ...