zoukankan      html  css  js  c++  java
  • 【洛谷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");
            }
        }
    }
  • 相关阅读:
    [蓝桥] 基础练习 数列排序(java)
    关不掉之以假乱真
    关不掉.vbs
    1.3内置数据类型
    1.2成员变量+类变量+static关键字
    1.1变量+命名规则
    Java 大数任意进制转换
    打印十字图
    c语言求最大公约数和最小公倍数
    核桃的数量
  • 原文地址:https://www.cnblogs.com/zcysky/p/7443642.html
Copyright © 2011-2022 走看看