BZOJ 4028 分块
zrt当年是怎么想到的…….
思路:
考虑把序列分块
对于每块 存xor[i] 表示从本块开头到i的前缀异或和
把它扔进set里
存gcd[i]表示从本块开头到i的前缀gcd.
如果这一块的GCD和整个的gcd的gcd是一样的 从set里找ans
否则暴力..
GCD最多log种 所以是复杂度是O(nsqrt(n)logn)的
//By SiriusRen
#include <cmath>
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100050;
int n,q,a[N],Block,block[N],XOR[N],GCD[N];
char op[150];
typedef long long ll;
set<int>s[320];
int gcd(int x,int y){return y?gcd(y,x%y):x;}
signed main(){
scanf("%d",&n),Block=sqrt(n);
for(int i=0;i<n;i++)scanf("%d",&a[i]),block[i]=i/Block+1;
for(int i=0;i<n;i++){
if(block[i]==block[i-1])XOR[i]=XOR[i-1]^a[i],GCD[i]=gcd(a[i],GCD[i-1]);
else XOR[i]=a[i],GCD[i]=a[i];
s[block[i]].insert(XOR[i]);
}
scanf("%d",&q);
while(q--){
scanf("%s",op);
if(op[0]=='M'){
int xx,yy;
scanf("%d%d",&xx,&yy),a[xx]=yy;
s[block[xx]].clear();
int tp=lower_bound(block,block+n,block[xx])-block;
XOR[tp]=a[tp],GCD[tp]=a[tp];s[block[xx]].insert(XOR[tp]);
for(int i=tp+1;block[i]==block[tp];i++)
XOR[i]=XOR[i-1]^a[i],GCD[i]=gcd(a[i],GCD[i-1]),s[block[xx]].insert(XOR[i]);
}
else{
ll Q;int Gcd=GCD[lower_bound(block,block+n,2)-block-1],Xor=XOR[lower_bound(block,block+n,2)-block-1];
scanf("%lld",&Q);
for(int i=0;block[i]==1;i++)
if((ll)GCD[i]*XOR[i]==Q){printf("%d\n",i);goto ed;}
for(int i=2;i<=block[n-1];i++){
if(gcd(GCD[upper_bound(block,block+n,i)-block-1],Gcd)!=Gcd){
int tp=lower_bound(block,block+n,i)-block;
for(int j=tp;block[j]==block[tp];j++){
Gcd=gcd(Gcd,a[j]),Xor^=a[j];
if((ll)Gcd*Xor==Q){printf("%d\n",j);goto ed;}
}
continue;
}
ll temp=(Q/Gcd)^Xor;
if(s[i].find(temp)!=s[i].end()){
int tp=lower_bound(block,block+n,i)-block;
for(int j=tp;block[j]==block[tp];j++)
if(XOR[j]==temp){printf("%d\n",j);goto ed;}
}
Xor^=XOR[upper_bound(block,block+n,i)-block-1];
}
puts("no");
}ed:;
}
}
BZOJ 4028 分块的更多相关文章
- BZOJ 4028: [HEOI2015]公约数数列 分块
4028: [HEOI2015]公约数数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4028 Description 设计一个数据结 ...
- gcd的性质+分块 Bzoj 4028
4028: [HEOI2015]公约数数列 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 865 Solved: 311[Submit][Statu ...
- BZOJ 4028: [HEOI2015]公约数数列 【分块 + 前缀GCD】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=4028 4028: [HEOI2015]公约数数列 Time Limit: 10 Sec ...
- bzoj 2821 分块处理
大题思路就是分块,将n个数分成sqrt(n)个块,然后 处理出一个w数组,w[i,j]代表第i个块到第j个块的答案 那么对于每组询问l,r如果l,r在同一个块中,直接暴力做就行了 如果不在同一个块中, ...
- bzoj 2741 分块+可持久化trie
多个询问l,r,求所有子区间异或和中最大是多少 强制在线 做法: 分块+可持久化trie 1.对于每块的左端点i,预处理出i到任意一个j,()i,j)间所有子区间异或和中最大为多少,复杂度O(\(n\ ...
- bzoj 4028 : [HEOI2015]公约数数列
之前看了好几次都没什么思路,今天下定决心把这题切了. 观察到$0-x$的gcd最多变化log次,因为它每次变化一定至少要去掉一个质因子,所以我们可以枚举gcd. 因为数据范围比较小,所以想到了分块. ...
- bzoj 2821 分块
分块: 先预处理,将原序列分成长度为len的许多块,计算从第i块到第j块的答案,(可以做到O(n*n/len)). 每次询问时,将询问的区间分成三部分,:左边,中间,右边,中间是尽量大的一个块区间,其 ...
- BZOJ - 2741 分块维护最大连续异或和
题意:给定\(a[l...r]\),多次询问区间\([l,r]\)中的最大连续异或和\(a_i⊕a_{i+1}⊕...⊕a_{j},l≤i≤j≤r\) 一眼过去认为是不可做的,但题目给出\(n=1.2 ...
- BZOJ - 2957 (分块/线段树)
题目链接 本质是维护斜率递增序列. 用分块的方法就是把序列分成sqrt(n)块,每个块分别用一个vector维护递增序列.查询的时候遍历所有的块,同时维护当前最大斜率,二分找到每个块中比当前最大斜率大 ...
随机推荐
- LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)
LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...
- java控制台输入输出字符串
一.实例说明 本实例通过输入流(System.in)实现从控制台接受用户输入信息,并将该信息输出到控制台. 运行效果如下图: 二.实现代码 三.要点说明 该实例的关键就是用到了System类的输入流, ...
- 关于table排版
colspan和rowspan这两个属性用于创建特殊的表格. colspan是“column span(跨列)”的缩写.colspan属性用在td标签中,用来指定单元格横向跨越的列数: 在浏览器中 ...
- PhotoZoom放大的图片效果怎么样?清不清晰?
PhotoZoom是一款使用了革命性技术.效果最好的图像无损放大工具.它可以对图片进行放大而没有锯齿,不会失真,让您无与伦比完美放大图像质量. PhotoZoom Pro使用了S-Spline Max ...
- ES2015 模板字符串 ``
js中类似`${xx,yy}`的语句是什么意思? `string` 是模板字符串,ES2015新增的符号. var x = 'a', y = 'b'; var z = `${x,y}`; //'b' ...
- Nginx 支持websocket的配置
Nginx 支持websocket的配置server { listen 80; server_name 域名; location / { proxy_pass http://127.0.0.1:808 ...
- Python基础学习_01字符串的拼接(字符串的格式化输出)
# 字符串的拼接 ---字符串的格式化输出 # 字符串的拼接 ---字符串的格式化输出 name = input("name:") age = input("age:&q ...
- 探索JS引擎工作原理 (转)
这篇文章从相对底层的角度介绍了js引擎的工作 引入了 静态作用域 执行环境上下文(context) 等概念 , http://www.cnblogs.com/onepixel/p/5090799.ht ...
- 【BZOJ3065】带插入区间k小值
题意: 带插入,修改的区间k小值在线查询 原序列长度<=35000,插入个数<=35000,修改个数<=70000,0<=权值<=70000 题解: Orz vfleak ...
- 【JavaScript框架封装】实现一个类似于JQuery的DOM框架的封装
// DOM框架(选择器框架) (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({ /** * 向现 ...