【洛谷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");
        }
    }
}

 

posted @ 2017-08-28 14:14  zcysky  阅读(275)  评论(0编辑  收藏  举报