此题关键:任何时候这n个数字均互不相同!!!
所以就可以直接上线段树,放心大胆的维护一个最大值,最小值,询问时直接判断maxx-minn是否等于r-l即可
#include<algorithm> #include<iostream> #include<iomanip> #include<cstring> #include<cstdio> #include<cmath> #define int long long using namespace std; const int INF=0x7fffffff,mod=998244353,P=29; int read() { int s=0,bj=0; char ch=getchar(); while(ch<'0'||ch>'9')bj|=(ch=='-'),ch=getchar(); while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar(); return bj?-s:s; } void printnum(int x) { if(x>9)printnum(x/10); putchar(x%10^48); } void print(int x,char ch) { if(x<0){putchar('-');x=-x;} printnum(x);putchar(ch); } int n,m; int a[100005]; struct node{int l,r,maxx,minn;}tree[400005]; void pushup(int k) { tree[k].maxx=max(tree[k<<1].maxx,tree[k<<1|1].maxx); tree[k].minn=min(tree[k<<1].minn,tree[k<<1|1].minn); } void Build(int k,int l,int r) { tree[k].l=l;tree[k].r=r; if(l==r){tree[k].maxx=tree[k].minn=a[l];return;} int mid=(l+r)>>1; Build(k<<1,l,mid);Build(k<<1|1,mid+1,r);pushup(k); } void Modify(int k,int x,int d) { if(tree[k].l==tree[k].r){tree[k].maxx=tree[k].minn=d;return;} int mid=(tree[k].l+tree[k].r)>>1; if(x<=mid)Modify(k<<1,x,d); else Modify(k<<1|1,x,d); pushup(k); } int Ask_maxx(int k,int l,int r) { int maxx=0; if(l<=tree[k].l&&r>=tree[k].r)return tree[k].maxx; int mid=(tree[k].l+tree[k].r)>>1; if(l<=mid)maxx=max(maxx,Ask_maxx(k<<1,l,r)); if(r>mid)maxx=max(maxx,Ask_maxx(k<<1|1,l,r)); return maxx; } int Ask_minn(int k,int l,int r) { int minn=INF; if(l<=tree[k].l&&r>=tree[k].r)return tree[k].minn; int mid=(tree[k].l+tree[k].r)>>1; if(l<=mid)minn=min(minn,Ask_minn(k<<1,l,r)); if(r>mid)minn=min(minn,Ask_minn(k<<1|1,l,r)); return minn; } signed main() { n=read();m=read(); for(int i=1;i<=n;++i)a[i]=read(); Build(1,1,n); int opt,x,y; for(int i=1;i<=m;++i) { opt=read();x=read();y=read(); if(opt==1)Modify(1,x,y); else { int maxx=Ask_maxx(1,x,y),minn=Ask_minn(1,x,y); if(maxx-minn==y-x)puts("YES"); else puts("NO"); } } return 0; }
此外,如果这道题没有保证互不相同怎么办呢?(我考场上没看到互不相同写了半天毒瘤了T_T),可以通过维护max,min和(p为一个质数),通过等比数列求和公式
算出他应该的值,若两个不同,就说明不是连续的
核心代码:
if(maxx-minn+1==y-x+1&&(Qpow(P,maxx-minn+1)-1)*getInv(P-1,mod)%mod*Qpow(P,minn)%mod==num1)puts("YES"); //在模意义下的除法可以转换为乘上他的逆元 else puts("NO");