[BZOJ4373][线段树]算术天才⑨与等差数列
来源:互联网 发布:java jar 运行参数 编辑:程序博客网 时间:2024/05/29 18:43
%%%Claris
我比较蠢……打了三个线段树,至于
#include <cstdio>#include <iostream>#include <algorithm>#include <map>#include <set>#define N 300010using namespace std;int n,m,ttt;int A[N],B[N],C[N];map<int,int> M;set<int> S[N<<1];set<int>::iterator itr;struct seg{ int l,r,x,Max,Min; }T1[N*5],T2[N*5],T3[N*5];inline void rea(int &x){ char c=getchar(); x=0; for(;c>'9'||c<'0';c=getchar()); for(;c>='0'&&c<='9';x=x*10+c-'0',c=getchar());}int gcd(int x,int y){ if(x==0||y==0) return x+y; return y?gcd(y,x%y):x;}inline void Up(seg *A,int g){ A[g].x=gcd(A[g<<1].x,A[g<<1|1].x); A[g].Max=max(A[g<<1].Max,A[g<<1|1].Max); A[g].Min=min(A[g<<1].Min,A[g<<1|1].Min);}void Build(int g,int l,int r,seg *T,int *B){ T[g].l=l; T[g].r=r; if(l==r) return void(T[g].x=T[g].Max=T[g].Min=B[l]); int mid=l+r>>1; Build(g<<1,l,mid,T,B); Build(g<<1|1,mid+1,r,T,B); Up(T,g);}void Update(int g,int x,seg *T,int *A){ if(T[g].l==T[g].r) return void(T[g].x=T[g].Min=T[g].Max=A[x]); int mid=T[g].l+T[g].r>>1; if(x<=mid) Update(g<<1,x,T,A); else Update(g<<1|1,x,T,A); Up(T,g);}int theMin(int g,int l,int r,seg *T){ if(T[g].l==l&&T[g].r==r) return T[g].Min; int mid=T[g].l+T[g].r>>1; if(r<=mid) return theMin(g<<1,l,r,T); if(l>mid) return theMin(g<<1|1,l,r,T); return min(theMin(g<<1,l,mid,T),theMin(g<<1|1,mid+1,r,T));}int theMax(int g,int l,int r,seg *T){ if(T[g].l==l&&T[g].r==r) return T[g].Max; int mid=T[g].l+T[g].r>>1; if(r<=mid) return theMax(g<<1,l,r,T); if(l>mid) return theMax(g<<1|1,l,r,T); return max(theMax(g<<1,l,mid,T),theMax(g<<1|1,mid+1,r,T));}int query(int g,int l,int r,seg *T){ if(T[g].l==l&&T[g].r==r) return T[g].x; int mid=T[g].l+T[g].r>>1; if(r<=mid) return query(g<<1,l,r,T); if(l>mid) return query(g<<1|1,l,r,T); return gcd(query(g<<1,l,mid,T),query(g<<1|1,mid+1,r,T));}int main(){ rea(n); rea(m); int tot=0; for(int i=1;i<=n;i++){ rea(A[i]); int x; if(M[A[i]]) x=M[A[i]]; else x=M[A[i]]=++tot; if(S[x].empty()) S[x].insert(i),B[i]=0; else{ S[x].insert(i); itr=S[x].find(i); itr--; B[i]=*itr; } C[i]=abs(A[i]-A[i-1]); } Build(1,1,n,T1,B); Build(1,1,n,T2,C); Build(1,1,n,T3,A); int cnt=0; while(m--){ int op,x,y,k; rea(op); if(op==1){ rea(x); rea(y); x^=cnt; y^=cnt; int p=M[A[x]]; itr=S[p].find(x); itr++; if(itr!=S[p].end()){ int now=*itr; itr--; if(itr==S[p].begin()) B[now]=0; else itr--,B[now]=*itr; Update(1,now,T1,B); } S[p].erase(x); A[x]=y; if(M[y]) p=M[y]; else p=M[y]=++tot; S[p].insert(x); itr=S[p].find(x); if(itr!=S[p].begin()) itr--,B[x]=*itr,itr++; else B[x]=0; Update(1,x,T1,B); itr++; if(itr!=S[p].end()){ B[*itr]=x; Update(1,*itr,T1,B); } C[x]=abs(A[x]-A[x-1]); if(x<n) C[x+1]=abs(A[x]-A[x+1]); Update(1,x,T2,C); Update(1,x+1,T2,C); Update(1,x,T3,A); } else{ rea(x); rea(y); rea(k); x^=cnt; y^=cnt; k^=cnt; if(x>y) swap(x,y); if(y==x) { puts("Yes"); cnt++; continue; } if(k==0) if(theMax(1,x,y,T3)==theMin(1,x,y,T3)) { puts("Yes"); cnt++; continue; } else { puts("No"); continue; } if(theMax(1,x,y,T1)>=x) { puts("No"); continue; } if((theMax(1,x,y,T3)-theMin(1,x,y,T3))!=k*(y-x)) { puts("No"); continue; } if(query(1,x+1,y,T2)%k==0) { puts("Yes"); cnt++; } else puts("No"); } }}
0 0
- 【线段树】BZOJ4373算术天才与等差数列
- 【线段树】BZOJ4373算术天才与等差数列
- 线段树 bzoj4373 算术天才⑨与等差数列
- BZOJ4373: 算术天才⑨与等差数列 线段树
- [BZOJ4373][线段树]算术天才⑨与等差数列
- [BZOJ4373算术天才⑨与等差数列] 线段树
- 【BZOJ4373】算术天才⑨与等差数列
- [bzoj4373]算术天才⑨与等差数列
- BZOJ4373 算术天才⑨与等差数列
- 【bzoj4373】算术天才⑨与等差数列
- [bzoj4373]算术天才⑨与等差数列
- 【bzoj4373】算术天才⑨与等差数列
- bzoj4373 算术天才⑨与等差数列
- [bzoj4373]算术天才⑨与等差数列 解题报告
- BZOJ 4373(算术天才⑨与等差数列-线段树+hash)
- BZOJ 4373 算术天才⑨与等差数列 [线段树]
- [BZOJ]4373: 算术天才⑨与等差数列 线段树+hash
- bzoj 4373: 算术天才⑨与等差数列 (线段树||线段树+set)
- MAT函数
- opencv函数源码之直方图规定化(2)
- 41. First Missing Positive
- 算法--冒泡排序-Java实现
- 组合模式--统一区别,同样对待(结构型模式02)
- [BZOJ4373][线段树]算术天才⑨与等差数列
- 简单实现两个listView的联动效果(网络框架Retrofit+Rxjava)
- BZOJ P3437 小P的牧场
- 人工智能终究会抢了我们程序员的饭碗
- Liunx 上面使用Python连接Redis遇到的一些问题
- 集合类2-TreeSet
- Windows BAT脚本中调用BAT脚本导致CMD退出的问题
- 1333: Funny Car Racing(最短路用spfa)
- 20170405_shell编程