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 分块的更多相关文章

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

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

  2. gcd的性质+分块 Bzoj 4028

    4028: [HEOI2015]公约数数列 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 865  Solved: 311[Submit][Statu ...

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

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

  4. bzoj 2821 分块处理

    大题思路就是分块,将n个数分成sqrt(n)个块,然后 处理出一个w数组,w[i,j]代表第i个块到第j个块的答案 那么对于每组询问l,r如果l,r在同一个块中,直接暴力做就行了 如果不在同一个块中, ...

  5. bzoj 2741 分块+可持久化trie

    多个询问l,r,求所有子区间异或和中最大是多少 强制在线 做法: 分块+可持久化trie 1.对于每块的左端点i,预处理出i到任意一个j,()i,j)间所有子区间异或和中最大为多少,复杂度O(\(n\ ...

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

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

  7. bzoj 2821 分块

    分块: 先预处理,将原序列分成长度为len的许多块,计算从第i块到第j块的答案,(可以做到O(n*n/len)). 每次询问时,将询问的区间分成三部分,:左边,中间,右边,中间是尽量大的一个块区间,其 ...

  8. BZOJ - 2741 分块维护最大连续异或和

    题意:给定\(a[l...r]\),多次询问区间\([l,r]\)中的最大连续异或和\(a_i⊕a_{i+1}⊕...⊕a_{j},l≤i≤j≤r\) 一眼过去认为是不可做的,但题目给出\(n=1.2 ...

  9. BZOJ - 2957 (分块/线段树)

    题目链接 本质是维护斜率递增序列. 用分块的方法就是把序列分成sqrt(n)块,每个块分别用一个vector维护递增序列.查询的时候遍历所有的块,同时维护当前最大斜率,二分找到每个块中比当前最大斜率大 ...

随机推荐

  1. html5左右滑动页面效果实现

    The Demo of h5 slider achiev by Myself 主要思路: 设置一个容器container,然后里面有几个page,获取到屏幕的宽度并将其赋值给page,然后contai ...

  2. okhttp3 ExceptionInInitializerError 异常处理

    okhttp3 在Android4.4上出现下面异常 java.lang.ExceptionInInitializerError at okhttp3.OkHttpClient.newSslSocke ...

  3. 【Oracle】Rman简介

    1.备份和恢复功能的用途: –保护数据 -介质故障 -用户错误 -应用程序错误 –数据保存和历史数据保留 –数据传输 2.典型的备份和恢复任务 –通过配置数据库实现可恢复 –定义备份计划 –对不同类型 ...

  4. C# 6.0新加特性

    1.自动属性的增强 1.1.自动属性初始化 (Initializers for auto-properties) C#4.0下的果断实现不了的. C#6.0中自动属性的初始化方式 只要接触过C#的肯定 ...

  5. switch注意事项

    Day03_SHJavaTraining_4-5-2017 switch注意事项:①switch语句接受的数据类型 switch语句中的表达式的数据类型,是有要求的 JDK1.0 - 1.4    数 ...

  6. Linux系统编程博客参考

    通过看前人的博客更易于把握知识要点 http://www.cnblogs.com/mickole/category/496206.html <Linux系统编程> http://www.c ...

  7. BZOJ 1264: [AHOI2006]基因匹配Match DP_树状数组_LCS转LIS

    由于有重复数字,我们以一个序列为基准,另一个序列以第一个序列每个数所在下标为这个序列每个数对应的值. 注意的是,拆值的时候按照在第一个序列中的位置从大到小排,强制只能选一个. 最后跑一边最长上升子序列 ...

  8. Day 08 字符编码

    字符编码 计算机基础 启动应用程序 1.双击QQ 2.操作系统接受指定然后把该操作转化为0和1发送给CPU 3.CPU接受指令然后把指令发给内存 4.内存接受指令把指令发送给硬盘获取数据 5.QQ在内 ...

  9. Node-Blog整套前后端学习记录

    Node-Blog 后端使用node写的一个一整套的博客系统 #### 主要功能 登录 注册 发表文章 编辑/删除文章 添加/删除/编辑文章分类 账号的管理 评论功能 ... 所用技术 node ex ...

  10. NOIP2018提高组省一冲奖班模测训练(五)

    NOIP2018提高组省一冲奖班模测训练(五) http://www.51nod.com/Contest/ContestDescription.html#!#contestId=79 今天有点浪…… ...