[BZOJ4028][HEOI2015]公约数数列(分块)
先发掘性质:
1.xor和gcd均满足交换律与结合率。
2.前缀gcd最多只有O(log)个。
但并没有什么数据结构能同时利用这两个性质,结合Q=10000,考虑分块。
对每块记录这几个信息:
1.块内所有数的gcd与异或和。
2.将块内所有前缀异或和放入一个数组排序。
查询时从前往后遍历每个块:
1.若当前块不使gcd改变,二分查找是否存在答案。
2.若改变,暴力查找答案。
复杂度(设块大小为S,值域为M):
1.修改复杂度$O(S\log S)$
2.查询复杂度$O(S\log M+\frac{n}{S}\log S)$。
当$S=\sqrt{n}$时复杂度最优,为$O(Q\sqrt{n}\log n)$。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=,K=;
char op[];
int n,B,tot,Q,ans,L[K],R[K];
ll x,k,a[N],G[K],X[K];
struct P{ ll x; int id; }p[N];
bool operator <(const P &a,const P &b){ return (a.x==b.x) ? a.id<b.id : a.x<b.x; } ll gcd(ll a,ll b){ return b ? gcd(b,a%b) : a; } void build(int x){
G[x]=X[x]=a[L[x]]; p[L[x]]=(P){X[x],L[x]};
rep(j,L[x]+,R[x]) G[x]=gcd(G[x],a[j]),X[x]^=a[j],p[j]=(P){X[x],j};
sort(p+L[x],p+R[x]+);
} int find(int l,int r,ll k){
while (l<r){
int mid=(l+r)>>;
if (p[mid].x<k) l=mid+; else r=mid;
}
return r;
} int main(){
freopen("bzoj4028.in","r",stdin);
freopen("bzoj4028.out","w",stdout);
scanf("%d",&n); B=; tot=(n-)/B+;
rep(i,,n) scanf("%lld",&a[i]);
rep(i,,tot) L[i]=(i-)*B+,R[i]=min(n,i*B),build(i);
for (scanf("%d",&Q); Q--; ){
scanf("%s",op);
if (op[]=='M') scanf("%lld%lld",&x,&k),x++,a[x]=k,build((x-)/B+);
else{
scanf("%lld",&x); ll g=a[],t=; bool w=;
rep(i,,tot){
if (gcd(g,G[i])==g){
if (x%g==){
ll k=x/g^t; int ans=find(L[i],R[i],k);
if (p[ans].x==(x/g^t)){ printf("%d\n",p[ans].id-); w=; break; }
}
g=gcd(g,G[i]); t^=X[i];
}else
rep(j,L[i],R[i]){
g=gcd(g,a[j]); t^=a[j];
if (g*t==x){ printf("%d\n",j-); w=; break; }
}
if (w) break;
}
if (!w) puts("no");
}
}
return ;
}
[BZOJ4028][HEOI2015]公约数数列(分块)的更多相关文章
- 【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][HAOI2015]公约数数列[分块+分析暴力]
题意 题目链接 分析 首先明确 \(xor\) 运算和 \(\rm gcd\) 没有联系! 注意到一个数字取 \(\rm gcd\) 且保证每次取 \(\rm gcd\) 值都会变小的话,最多取 \( ...
- 【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 ...
- 洛谷 P4108 / loj 2119 [HEOI2015] 公约数数列 题解【分块】
看样子分块题应该做的还不够. 题目描述 设计一个数据结构. 给定一个正整数数列 \(a_0, a_1, \ldots , a_{n-1}\),你需要支持以下两种操作: MODIFY id x: 将 \ ...
- luogu P4108 [HEOI2015]公约数数列——solution
-by luogu 不会啊.... 然后%了一发题解, 关键是 考虑序列{$a_n$}的前缀gcd序列, 它是单调不升的,且最多只会改变$log_2N$次,因为每变一次至少除2 于是,当我们询问x时: ...
随机推荐
- Count on a tree(SPOJ COT + 树上第k大 + 主席树 + LCA)
题目链接:https://www.spoj.com/problems/COT/en/ 题目: 题意: 给你一棵有n个节点的树,求节点u到节点v这条链上的第k大. 思路: 我们首先用dfs进行建题目给的 ...
- Chrome浏览器任意修改网页内容
在Chrome浏览器按F12,打开开发者工具,切换到console选项卡: 在下面的输入行输入下面的命令回车: document.body.contentEditable="true&quo ...
- 37 - 网络编程-UDP编程
目录 1 UDP协议 2 UDP通信流程 3 UDP编程 3.1 构建服务端 3.3 常用方法 4 聊天室 5 UDP协议应用 1 UDP协议 UDP是面向无连接的协议,使用UDP协议时,不需要建立连 ...
- Linux轻量级自动运维工具-Ansible浅析【转】
转自 Linux轻量级自动运维工具-Ansible浅析 - ~微风~ - 51CTO技术博客http://weiweidefeng.blog.51cto.com/1957995/1895261 Ans ...
- Machine Learning系列--TF-IDF模型的概率解释
信息检索概述 信息检索是当前应用十分广泛的一种技术,论文检索.搜索引擎都属于信息检索的范畴.通常,人们把信息检索问题抽象为:在文档集合D上,对于由关键词w[1] ... w[k]组成的查询串q,返回一 ...
- C基础 如何让代码只执行一次
1.0 最简单, 最高效的方式 C 代码运行起点 main 就是个大单例函数. 如果把函数注册在其里面, 那么一定很可以 :) // 某个库需要初始化的函数 void log_init(void) { ...
- java版云笔记(二)
云笔记 基本的环境搭建好了,今天做些什么呢,第一是链接数据库(即搭建Spring-Batistas环境),第二是登录预注册. 注:这个项目的sql文件,需求文档,需要的html文件,jar包都可以去下 ...
- Python股票信息抓取~
本来想把股票的涨跌抓取出来,用汇通网的股票为例,就找了国际外汇为例. 页面里有xhr请求,并且每个xhr的url请求的 http://api.q.fx678.com/history.php?symbo ...
- Mysql学习之order by的工作原理
在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求.假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名.年龄. 查询语句为: ; 全字段排序 为 ...
- [你必须知道的.NET]第二十三回:品味细节,深入.NET的类型构造器
发布日期:2008.11.2 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 今天Artech兄在<关于Type Init ...