zrt当年是怎么想到的…….

思路:

考虑把序列分块

对于每块 存xor[i] 表示从本块开头到i的前缀异或和

把它扔进set里

存gcd[i]表示从本块开头到i的前缀gcd.

如果这一块的GCD和整个的gcd的gcd是一样的 从set里找ans

否则暴力..

GCD最多log种 所以是复杂度是O(nsqrt(n)logn)的

  1. //By SiriusRen
  2. #include <cmath>
  3. #include <set>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <algorithm>
  7. using namespace std;
  8. const int N=100050;
  9. int n,q,a[N],Block,block[N],XOR[N],GCD[N];
  10. char op[150];
  11. typedef long long ll;
  12. set<int>s[320];
  13. int gcd(int x,int y){return y?gcd(y,x%y):x;}
  14. signed main(){
  15. scanf("%d",&n),Block=sqrt(n);
  16. for(int i=0;i<n;i++)scanf("%d",&a[i]),block[i]=i/Block+1;
  17. for(int i=0;i<n;i++){
  18. if(block[i]==block[i-1])XOR[i]=XOR[i-1]^a[i],GCD[i]=gcd(a[i],GCD[i-1]);
  19. else XOR[i]=a[i],GCD[i]=a[i];
  20. s[block[i]].insert(XOR[i]);
  21. }
  22. scanf("%d",&q);
  23. while(q--){
  24. scanf("%s",op);
  25. if(op[0]=='M'){
  26. int xx,yy;
  27. scanf("%d%d",&xx,&yy),a[xx]=yy;
  28. s[block[xx]].clear();
  29. int tp=lower_bound(block,block+n,block[xx])-block;
  30. XOR[tp]=a[tp],GCD[tp]=a[tp];s[block[xx]].insert(XOR[tp]);
  31. for(int i=tp+1;block[i]==block[tp];i++)
  32. XOR[i]=XOR[i-1]^a[i],GCD[i]=gcd(a[i],GCD[i-1]),s[block[xx]].insert(XOR[i]);
  33. }
  34. else{
  35. ll Q;int Gcd=GCD[lower_bound(block,block+n,2)-block-1],Xor=XOR[lower_bound(block,block+n,2)-block-1];
  36. scanf("%lld",&Q);
  37. for(int i=0;block[i]==1;i++)
  38. if((ll)GCD[i]*XOR[i]==Q){printf("%d\n",i);goto ed;}
  39. for(int i=2;i<=block[n-1];i++){
  40. if(gcd(GCD[upper_bound(block,block+n,i)-block-1],Gcd)!=Gcd){
  41. int tp=lower_bound(block,block+n,i)-block;
  42. for(int j=tp;block[j]==block[tp];j++){
  43. Gcd=gcd(Gcd,a[j]),Xor^=a[j];
  44. if((ll)Gcd*Xor==Q){printf("%d\n",j);goto ed;}
  45. }
  46. continue;
  47. }
  48. ll temp=(Q/Gcd)^Xor;
  49. if(s[i].find(temp)!=s[i].end()){
  50. int tp=lower_bound(block,block+n,i)-block;
  51. for(int j=tp;block[j]==block[tp];j++)
  52. if(XOR[j]==temp){printf("%d\n",j);goto ed;}
  53. }
  54. Xor^=XOR[upper_bound(block,block+n,i)-block-1];
  55. }
  56. puts("no");
  57. }ed:;
  58. }
  59. }

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. TensorFlow-LSTM序列预测

    问题情境:已知某一天内到目前为止股票各个时刻的价格,预测接下来短时间内的价格变化. import tushare as ts import time from collections import n ...

  2. 【技术累积】【点】【java】【2】聊一聊似曾相识的switch语句

    闲聊 有些东西并不能像爱因斯坦老先生说的那样,书上查的到就不用去记住... 开始 java使用了C的所有流程控制语句: java中同样有switch语句: 大多数情况下,switch都可以用if替换: ...

  3. JS面向对象(1)——构造函数模式和原型模式

    1.构造函数模式 构造函数用来创建特定的类型的对象.如下所示: function Person(name,age,job){ this.name=name; this.job=job; this.ag ...

  4. bootstrap与jQuery结合的动态进度条

    此款进度条实现的功能: 1.利用了bootstrap的进度条组件. a.在最外层的<div>中加入class .progress,在里层<div>加入class .progre ...

  5. Js中判断变量存不存在的问题

    前面写过jquery对象存在与否的判断.现在谈下Js中判断变量存不存在的问题. 如果这样if(!a),当变量a在js中没有申明时,就会报错,那么接下去的代码将不会被执行.注意,这种判断只要变量申明过, ...

  6. MongoDB 学习笔记(一):安装及简单shell操作

    一.说明 1.该系列MongoDB学习笔记的学习环境采用的MongoDB版本为mongodb-win32-i386-2.4.6,操作系统为win7. 二.安装 1.新建两个目录,分别是D:\Insta ...

  7. MySQL数据表查询操

    准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名 ...

  8. 路飞学城Python-Day114

    120-基于用户认证组件的登陆验证信息存储 from django.shortcuts import render, HttpResponse, redirect from django.contri ...

  9. JSplitPane按比例分割的问题

    JSplitPane看似比Delphi的spliter难用许多.不过介于swing可以方便的使用记事本一类文本编辑器直接书写依据布局的界面代码我们还是姑且容忍它带来的不便.但在使用JSplitPane ...

  10. alsa文章

    http://blog.csdn.net/azloong/article/details/6140824 http://blog.csdn.net/tianshuai1111/article/deta ...