设$pre[i]$表示第$i$个数上一次出现的位置,$d[i]=abs(a[i]-a[i+1])$。

用线段树维护区间内$a$的最小值、最大值,$pre$的最大值以及$d$的$\gcd$。

对于询问$l\ r\ k$,首先特判掉$l=r$或者$k=0$的情况。

然后求出区间最小值和最大值、以及$pre$的最大值,判断最值是否合法以及$pre$是否都小于$l$。

如果都满足,那么继续查询$[l,r-1]$里所有$d$的$\gcd$,如果$\gcd$是$k$的倍数,那么就可行。

时间复杂度$O(n\log n)$。

#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int N=300010,M=1050000;
int n,m,cnt,i,op,x,y,z,a[N],b[N],c[N],d[N],K;
int vmi[M],vma[M],vp[M],vd[M],mi,ma,flag,g;
map<int,int>id;
set<int>T[N<<1];
set<int>::iterator pre,nxt;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int abs(int x){return x>0?x:-x;}
inline int gcd(int a,int b){if(!a)return b;if(!b)return a;return __gcd(a,b);
}
inline int getid(int x){int&t=id[x];if(t)return t;t=++cnt;T[t].insert(0),T[t].insert(n+1);return t;
}
void build(int x,int a,int b){if(a==b){vmi[x]=vma[x]=::a[a];vp[x]=c[a];vd[x]=d[a];return;}int mid=(a+b)>>1;build(x<<1,a,mid),build(x<<1|1,mid+1,b);vmi[x]=min(vmi[x<<1],vmi[x<<1|1]);vma[x]=max(vma[x<<1],vma[x<<1|1]);vp[x]=max(vp[x<<1],vp[x<<1|1]);vd[x]=gcd(vd[x<<1],vd[x<<1|1]);
}
void changep(int x,int a,int b,int c,int p){if(a==b){vp[x]=p;return;}int mid=(a+b)>>1;if(c<=mid)changep(x<<1,a,mid,c,p);else changep(x<<1|1,mid+1,b,c,p);vp[x]=max(vp[x<<1],vp[x<<1|1]);
}
void change(int x,int a,int b,int c,int v,int p){if(a==b){vmi[x]=vma[x]=v;vp[x]=p;return;}int mid=(a+b)>>1;if(c<=mid)change(x<<1,a,mid,c,v,p);else change(x<<1|1,mid+1,b,c,v,p);vmi[x]=min(vmi[x<<1],vmi[x<<1|1]);vma[x]=max(vma[x<<1],vma[x<<1|1]);vp[x]=max(vp[x<<1],vp[x<<1|1]);
}
void changed(int x,int a,int b,int c,int p){if(a==b){vd[x]=p;return;}int mid=(a+b)>>1;if(c<=mid)changed(x<<1,a,mid,c,p);else changed(x<<1|1,mid+1,b,c,p);vd[x]=gcd(vd[x<<1],vd[x<<1|1]);
}
void ask(int x,int a,int b,int c,int d){if(c<=a&&b<=d){mi=min(mi,vmi[x]);ma=max(ma,vma[x]);if(vp[x]>=c)flag=1;return;}int mid=(a+b)>>1;if(c<=mid)ask(x<<1,a,mid,c,d);if(d>mid)ask(x<<1|1,mid+1,b,c,d);
}
void askd(int x,int a,int b,int c,int d){if(c<=a&&b<=d){g=gcd(g,vd[x]);return;}int mid=(a+b)>>1;if(c<=mid)askd(x<<1,a,mid,c,d);if(d>mid)askd(x<<1|1,mid+1,b,c,d);
}
inline bool query(int x,int y,int z){if(x==y)return 1;mi=1000000000,ma=flag=g=0;ask(1,1,n,x,y);if(!z)return mi==ma;if(flag)return 0;if(1LL*(y-x)*z+mi!=ma)return 0;askd(1,1,n,x,y-1);return g%z==0;
}
int main(){read(n),read(m);for(i=1;i<=n;i++){read(a[i]);T[b[i]=getid(a[i])].insert(i);pre=T[b[i]].find(i);c[i]=*(--pre);}for(i=1;i<n;i++)d[i]=abs(a[i]-a[i+1]);build(1,1,n);while(m--){read(op),read(x),read(y);x^=K,y^=K;if(op==1){pre=nxt=T[b[x]].find(x);pre--,nxt++;if(*nxt<n)changep(1,1,n,*nxt,*pre);T[b[x]].erase(x);b[x]=getid(y);T[b[x]].insert(x);pre=nxt=T[b[x]].find(x);pre--,nxt++;if(*nxt<n)changep(1,1,n,*nxt,x);change(1,1,n,x,a[x]=y,*pre);if(x>1)changed(1,1,n,x-1,abs(a[x-1]-y));if(x<n)changed(1,1,n,x,abs(y-a[x+1]));}else{read(z);if(query(x,y,z^K))K++,puts("Yes");else puts("No");}}return 0;
}

  

BZOJ4373 : 算术天才⑨与等差数列相关推荐

  1. BZOJ4373: 算术天才⑨与等差数列

    Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能 ...

  2. 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列

    hash大法好(@ARZhu):大数相乘及时取模真的是件麻烦事情 Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你, ...

  3. [bzoj4373]算术天才⑨与等差数列

    //被标题吸引进来,无论如何都要切出来 题目大意 给你一个长度为n的序列,有m个操作,写一个程序支持以下两个操作: 1. 修改一个值 2. 给出三个数l,r,k,询问:如果把区间[l,r]的数从小到大 ...

  4. 【BZOJ4373】算术天才⑨与等差数列

    Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能 ...

  5. P5278 算术天才⑨与等差数列 题解

    一道不错的题目,只不过能被 hash 和维护若干次方和通过,本篇讲正解. 考虑一个乱序序列重排后是等差数列的一些条件(设区间 [ l , r ] [l,r] [l,r],公差为 d d d): 数列最 ...

  6. 等差素数咧 c语言,等差数列

    1354. 等差数列2021-05-24 20:06:01 预处理出双平方数集合 枚举双平方数中的一对数作为等差数列的首项和第二项 剪枝: 计算出当前等差数列的末项,last=x+(n-1)*d比双平 ...

  7. 暑假训练-义乌(7.8-7.15)

    暑假训练 模拟赛 图表 数据 7.8(lxl) 7.9(lxl) 7.10(lxl) 7.11(lxl) 7.12(wls) 7.13(wls) 7.14(wls) 7.15(lfds) 训练 数据结 ...

  8. [生存志] 第117节 九章算术均徭赋

            九章算术均徭赋                  贾谊在27岁时向汉文帝进献的<治安策>一文,洋洋洒洒6844个字,写了汉帝国开国30年时的九件让他忧伤难过的事情,所谓『可 ...

  9. 开放性:你可能没听说过的终极大挑战(开放性既是驱动探索智能的力量之一,也可能直接就是AI本身的组成部分)

    编者注:更多关于人工智能信息请关注2018年4月10-13日人工智能北京大会.2018年1月26日之前购买门票享有早期最惠价格 . 人工智能(Artificial Intelligence, AI)是 ...

  10. #3316. baka

    题目描述 Worldwide_D最近沉迷东方. 数学课上,Worldwide_D在研究对数,然后渐渐睡着了.他梦见自己躺在幻想乡的雾之湖边,听见旁边有两个妖精在对话,原来是Cirno和Daiyouse ...

最新文章

  1. 隔离级别(未提交读、提交读、可重复读、可串行化)、多版本并发控制、Next-Key Locks(Record Locks、Gap Locks)
  2. Spring提供获取应用上下文的工具
  3. linux 历史命令快捷键,Linux历史命令及bash快捷键
  4. win32获取其它进程变量地址存放的信息
  5. 星巴克饮品中竟喝出活蟑螂?官方回应了...
  6. 【kafka】kafka 执行 多个脚本 kafka-run-class.sh 导致 server 节点 时不时挂掉
  7. php判断ajax传入,利用PHP判断是否为AJAX请求代码
  8. ifconfig命令举例
  9. 天猫标的就是虚价,果然败家节啊
  10. memcached 与 redis 的区别和具体应用场景
  11. QEMU/KVM libvirt X710 PCI passthrough DPDK 网络性能测试
  12. jenkins下载插件下载不了,解决办法
  13. 实用工具:常用数学公式
  14. 道长运维之正则表达式
  15. 计算机组成原理-计算机可靠性模型(串联并联系统/串并联混合系统)
  16. springBoot整合spring security实现权限管理(单体应用版)--筑基初期
  17. scikit-learn 机器学习:sklearn.neighbors 的k近邻算法使用
  18. 整顿风暴后网址导航将何去何从 如何孕育重生
  19. storm风暴英雄 tempo_Tempostorm攻略 10tips避免不合时宜之死
  20. 安全运维体系建设思路

热门文章

  1. [嵌入式]I2C协议指东
  2. [轉]PHP执行MYSQL存储过程报错:Commands out of sync; you can't run this command now 问题的解决...
  3. c form画直线_初一数学线段、射线、直线知识点精讲
  4. Linux设备模型初始化流程
  5. Linux用户态进程的内存管理浅析
  6. Linux_I2C读写流程
  7. Sofia-SIP辅助文档六 - Sofia-SIP中的SIP和SDP特性
  8. 多元Huffman编码问题
  9. hadoop 用MR实现join操作
  10. mysql与php的连接_PHP与Mysql的连接