您的位置:首页 > 其它

【洛谷P3792】由乃与大母神原型和偶像崇拜

2017-08-28 14:14 302 查看
如果不考虑重复,显然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
,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");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: