【洛谷P3792】由乃与大母神原型和偶像崇拜
如果不考虑重复,显然r-l==maxv-minv则可以保证合法。
如果考虑重复的话,可以用区间和和区间平方和辅助验证。
以上所有均可以用线段树维护。
#include<bits/stdc++.h> const int yql=998244353; const int N=500010; const int inf=0x7fffffff; using namespace std; typedef long long ll; int n,m,a[N],mx,mn,x,y,inv; ll ss,sum; inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } inline int fpow(int x,int p){ int ans=1; for(;p;p>>=1,x=(1LL*x*x)%yql)if(p&1)ans=(1LL*ans*x)%yql; return ans; } inline int calc(int x){return 1LL*x*(x+1)%yql*(x<<1|1)%yql*inv%yql;} struct Segment_Tree{ #define lson (o<<1) #define rson (o<<1|1) int maxv[N<<2],minv[N<<2]; ll sumv[N<<2],s[N<<2]; inline void pushup(int o){ maxv[o]=max(maxv[lson],maxv[rson]); minv[o]=min(minv[lson],minv[rson]); sumv[o]=(sumv[lson]+sumv[rson])%yql; s[o]=s[lson]+s[rson]; } inline void build(int o,int l,int r){ if(l==r){maxv[o]=minv[o]=s[o]=a[l];sumv[o]=(1LL*a[l]*a[l])%yql;return;} int mid=(l+r)>>1; build(lson,l,mid);build(rson,mid+1,r); pushup(o); } inline void change(int o,int l,int r,int q,int v){ if(l==r){maxv[o]=minv[o]=s[o]=v;sumv[o]=(1LL*v*v)%yql;return;} int mid=(l+r)>>1; if(q<=mid)change(lson,l,mid,q,v); else change(rson,mid+1,r,q,v); pushup(o); } inline void query(int o,int l,int r,int ql,int qr){ if(ql<=l&&r<=qr){ mx=max(maxv[o],mx);mn=min(mn,minv[o]);sum=(sum+sumv[o])%yql;ss+=s[o]; return; } int mid=(l+r)>>1; if(ql<=mid)query(lson,l,mid,ql,qr); if(qr>mid)query(rson,mid+1,r,ql,qr); } }T; int main(){ n=read();m=read();inv=fpow(6,yql-2); for(int i=1;i<=n;i++)a[i]=read(); T.build(1,1,n); while(m--){ int opt=read(),l=read(),r=read(); if(opt==1)T.change(1,1,n,l,r); else{ mx=0;mn=inf;ss=0;sum=0; T.query(1,1,n,l,r); if(mx-mn==r-l&&(1LL*(mx+mn)*(r-l+1))>>1==ss&&(calc(mx)-calc(mn-1)+yql)%yql==sum)puts("damushen"); else puts("yuanxing"); } } }
zzq wc-ctsc-apio-NOI Au;yql精通多项式;zyz精通女装;由乃精通数据结构;孔老师是毒奶大师;我没有学上:我们都有光明的前途。