题意

题目链接

分析

  • 首先明确 \(xor\) 运算和 \(\rm gcd\) 没有联系!

  • 注意到一个数字取 \(\rm gcd\) 且保证每次取 \(\rm gcd\) 值都会变小的话,最多取 \(\log\) 次。

    比较显然,如果每次都变小的话至少都除以了因子 \(2\) ,变为原来的二分之一。

  • 所以考虑一个暴力分块,记录每一块的 \(\rm gcd\) G[i]、异或和X[i]、前缀异或和。

  • 如果 \({\rm gcd}(lastgcd,G[i])=lastgcd\) ,那么直接在该块记录的前缀异或和中查找\(\frac{val}{lastgcd}\ {\rm xor}\ lastxorv\) 的最小的值即可。

  • 总时间复杂度为 \(O(n\log n \sqrt n)\)。

重点:\(\rm gcd\) 的取值次数最多有 \(\log\) 次变化!

代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
typedef pair<LL,int> pii;
const int N=1e5 + 7;
int n,sz;
int bl[N],a[N],G[N],X[N];
char s[N];
vector<pii>v[400];
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
void build(int z){
X[z]=0;v[z].clear();
rep(i, sz*(z-1)+1, min(sz*z,n)){
v[z].pb(make_pair(X[z]^=a[i],i));
G[z]=i==(sz*(z-1)+1)?a[i]:gcd(G[z],a[i]);
}
sort(v[z].begin(),v[z].end());
}
int query(LL val){
int lastg=a[1],lastx=0;
rep(i,1,sz){
lastg=i==1?a[1]:gcd(lastg,a[i]),lastx^=a[i];
if(1ll*lastg*lastx==val) return i;
}
rep(z,2,bl[n]){
if(gcd(lastg,G[z])==lastg){
LL to=(val/lastg)^lastx;lastx^=X[z];
if(val%lastg) continue;
int x=lower_bound(v[z].begin(),v[z].end(),make_pair(to,0))-v[z].begin();
if(x==v[z].size()) continue;
pii tmp=v[z][x];
if(tmp.first==to) return tmp.second;
}
else rep(i,sz*(z-1)+1,min(sz*z,n)){
lastg=gcd(lastg,a[i]),lastx^=a[i];
if(1ll*lastg*lastx==val) return i;
}
}
return 0;
}
int main(){
n=gi();sz=sqrt(n);
rep(i,1,n) a[i]=gi(),bl[i]=(i-1)/sz+1;
rep(z,1,bl[n]) build(z); int q=gi();
int x;LL y;
rep(i,1,q){
scanf("%s",s);
if(s[0]=='M') {
x=gi()+1,y=gi();
a[x]=y,build(bl[x]);
}else{
scanf("%lld",&y);
int res=query(y)-1;
if(res==-1) puts("no");
else printf("%d\n",res);
}
}
return 0;
}

[BZOJ4028][HAOI2015]公约数数列[分块+分析暴力]的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. BZOJ 4028: [HEOI2015]公约数数列 【分块 + 前缀GCD】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=4028 4028: [HEOI2015]公约数数列 Time Limit: 10 Sec   ...

  8. 数列分块总结——题目总版(hzwer分块九题及其他题目)(分块)

    闲话 莫队算法似乎还是需要一点分块思想的......于是我就先来搞分块啦! 膜拜hzwer学长神犇%%%Orz 这九道题,每一道都堪称经典,强力打Call!点这里进入 算法简述 每一次考试被炸得体无完 ...

  9. 数列分块入门九题(三):LOJ6283~6285

    Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...

随机推荐

  1. 阿里云全球首次互联网8K直播背后的技术解读

    3月28日,云栖大会·深圳峰会现场,阿里云发布并现场演示了阿里视频云最新8K互联网直播解决方案.这是全球发布的首个8K视频云解决方案,也是全球首次8K互联网视频直播. 视频地址:https://v.q ...

  2. September 14th 2017 Week 37th Thursday

    Don't let the past steal your present. 别让过去悄悄偷走了我们的当下. We take what we can get and make the best of ...

  3. MySQL复制(二)Master-Slave复制实践

    1. 准备工作 首先要准备2台机器,分别安装mysql 我这里的版本是5.1.73,mysql数据库安装请参考:http://www.cnblogs.com/tangyanbo/p/4289753.h ...

  4. memcache分布式 存取

    Memcached分布式 Memcached虽然称为“分布式“缓存服务器,但服务器端并没有“分布式”的功能.Memcached的分布式完全是由客户端实现的.memcached是怎么实现分布式缓存的呢? ...

  5. [DAViCHi/SeeYa/T-ARA][원더우먼][Wonder Woman]

    歌词来源:http://music.163.com/#/song?id=5371229 作曲 : 赵英秀 [作曲 : 赵英秀] [作曲 : 赵英秀] 作词 : K-Smith [作词 : KSmith ...

  6. 解决hibernate双向关系造成的一方重复执行SQl,或者死循环的问题

    系统采用struts-json hibernate3. 在对关联表配置manytoone onetomany双向关联的时候,在执行一方的时候,会发现打印出来的SQL语句多执行了一次或者多次.经过调试, ...

  7. CSS控制图片和文字在同一行显示且对齐的3种方法

    CSS控制图片和文字在同一行显示且对齐的3种方法 在 HTML 代码中,有时会需要在文字旁边加上一个图标. 默认情况,是图片置顶对齐,文字置底对齐,所以通常图片高,文字低,不能水平居中对齐. 常见方法 ...

  8. Angular总结一:环境搭建

    工欲善其事必先利其器,开发 Angular 项目首先要搭建环境.Angular 的环境搭建包括三个方面,开发环境 WebStorm,命令行工具 Angular CLI,以及 nodejs. 一.安装 ...

  9. 自定义ClassLoader

    自定义classloader MapleClassLoader package com.maple; import java.io.*; public class MapleClassLoader e ...

  10. virtualbox+vagrant学习-2(command cli)-14-vagrant reload命令

    Reload 格式: vagrant reload [vm-name] 其等价于在运行vagrant up命令后接着运行vagrant halt 要使在Vagrantfile文件中所做的更改生效,通常 ...