此题关键:任何时候这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"); 
京公网安备 11010502036488号