[BZOJ4028][HAOI2015]公约数数列[分块+分析暴力]
题意
分析
首先明确 \(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]公约数数列[分块+分析暴力]的更多相关文章
- [BZOJ4028][HEOI2015]公约数数列(分块)
先发掘性质: 1.xor和gcd均满足交换律与结合率. 2.前缀gcd最多只有O(log)个. 但并没有什么数据结构能同时利用这两个性质,结合Q=10000,考虑分块. 对每块记录这几个信息: 1.块 ...
- 【BZOJ4028】[HEOI2015]公约数数列 分块
[BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. M ...
- BZOJ 4028: [HEOI2015]公约数数列 分块
4028: [HEOI2015]公约数数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4028 Description 设计一个数据结 ...
- BZOJ4028 HEOI2015公约数数列(分块)
前缀gcd的变化次数是log的,考虑对每一种gcd查询,问题变为查询一段区间是否存在异或前缀和=x/gcd. 无修改的话显然可以可持久化trie,但这玩意实在没法支持修改.于是考虑分块. 对于每一块将 ...
- bzoj4028: [HEOI2015]公约数数列
Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x ...
- 【BZOJ4028】[HEOI2015]公约数数列(分块)
[BZOJ4028][HEOI2015]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(g ...
- BZOJ 4028: [HEOI2015]公约数数列 【分块 + 前缀GCD】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=4028 4028: [HEOI2015]公约数数列 Time Limit: 10 Sec ...
- 数列分块总结——题目总版(hzwer分块九题及其他题目)(分块)
闲话 莫队算法似乎还是需要一点分块思想的......于是我就先来搞分块啦! 膜拜hzwer学长神犇%%%Orz 这九道题,每一道都堪称经典,强力打Call!点这里进入 算法简述 每一次考试被炸得体无完 ...
- 数列分块入门九题(三):LOJ6283~6285
Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...
随机推荐
- [翻译] CRPixellatedView-用CIPixellate滤镜动态渲染UIView
CRPixellatedView-用CIPixellate滤镜动态渲染UIView https://github.com/chroman/CRPixellatedView 本人测试的效果: Usage ...
- codeforces 293E Close Vertices
题目链接 正解:点分治+树状数组. 点分治板子题,直接点分以后按照$w$排序,扫指针的时候把$w$合法的路径以$l$为下标加入树状数组统计就行了. 写这道题只是想看看我要写多久..事实证明我确实是老年 ...
- SSH环境搭建,配置整合初步(一)
1,新Webproject.并把编码设为utf-8(全部的都是uft8数据库也是,就不会乱码了)2.加入框架环境JunitStruts2Hibernate Spring3,整合SSHStruts2与S ...
- css中的相对定位与绝对定位的区别
1.绝对定位 position: absolute;绝对定位:绝对定位是相对于元素最近的已定位的祖先元素(即是设置了绝对定位或者相对定位的祖先元素).如果元素没有已定位的祖先元素,那么它的位置则是相对 ...
- Docker实战(五)之端口映射与容器互联
除了网络访问外,Docker还提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问. 1.端口映射实现访 ...
- js之radio应用实例
radio和checkbox还有select,可谓是前后端常用三剑客啊!特别是checkbox和select,关于这两个今天不讲,因为在下面这几篇文章,我已经比较详细的讲解了. SpringMVC之a ...
- Unix中Signal信号的不同
Unix系统signal函数的不同 (1)函数说明 在signal函数中,有两个形参,分别代表需要处理的信号编号值和处理信号函数的指针.它主要是用于前32种非实时信号的处理,不支持信号的传递信息.但是 ...
- rails使用Kindeditor网页编辑器
在gemfile中加入(后面版本别丢) gem 'rails_kindeditor', '~> 0.5.0' $ bundle 创建配置文件,并且引入js rails g rails_kinde ...
- 嵌入式C语言自我修养 03:宏构造利器:语句表达式
3.1 基础复习:表达式.语句和代码块 表达式 表达式和语句是 C 语言中的基础概念.什么是表达式呢?表达式就是由一系列操作符和操作数构成的式子.操作符可以是 C 语言标准规定的各种算术运算符.逻辑运 ...
- uboot-2012.04.01移植编译前准备
一:准备移植1.从下面的官网下载uboot-2012.04.012.建立sourceinsight工程 a.解压并在E:\colin weidongshan\transplant_u-boot-201 ...