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


    题目大意:维护一个序列,支持单点修改和查询一段区间能不能组成连续的一段数。

    题解:查询区间能不能组成一段连续的数这个操作较为复杂,很难在较小时间复杂度内直接维护。这里采用线段树维护区间哈希的策略,即:维护一些其他的值间接地去逼近正解。在这里维护区间最大值、最小值、区间和、区间平方和、区间立方和即可。另外,由于数据范围 1e9,需要进行取模操作。
    (脸黑,交了好几次才过。。QAQ

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=5e5+10;
    const long long inf=1e18;
    const int mod=1e9+7;
    
    inline int read(){
        int x=0,f=1;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
        do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
        return f*x;
    }
    
    int n,m;
    long long a[maxn],s1,s2,s3,mi,mx;
    struct node{
        #define ls(x) t[x].lc
        #define rs(x) t[x].rc
        int lc,rc;
        long long sum,sum2,sum3,mi,mx;
    }t[maxn<<1];
    int tot,root;
    inline void pushup(int x){
        t[x].mi=min(t[ls(x)].mi,t[rs(x)].mi);
        t[x].mx=max(t[ls(x)].mx,t[rs(x)].mx);
        t[x].sum=t[ls(x)].sum+t[rs(x)].sum;
        t[x].sum2=(t[ls(x)].sum2+t[rs(x)].sum2)%mod;
        t[x].sum3=(t[ls(x)].sum3+t[rs(x)].sum3)%mod;
    }
    int build(int l,int r){
        int x=++tot;
        if(l==r){t[x].mi=t[x].mx=t[x].sum=a[l],t[x].sum2=a[l]*a[l]%mod,t[x].sum3=t[x].sum2*a[l]%mod;return x;}
        int mid=l+r>>1;
        ls(x)=build(l,mid),rs(x)=build(mid+1,r);
        return pushup(x),x;
    }
    void modify(int x,int l,int r,int pos,long long val){
        if(l==r){t[x].mi=t[x].mx=val,t[x].sum=val,t[x].sum2=val*val%mod,t[x].sum3=t[x].sum2*val%mod;return;}
        int mid=l+r>>1;
        if(pos<=mid)modify(ls(x),l,mid,pos,val);
        else modify(rs(x),mid+1,r,pos,val);
        pushup(x);
    }
    void query(int o,int l,int r,int x,int y){
        if(l==x&&r==y){
            mi=min(mi,t[o].mi),mx=max(mx,t[o].mx);
            s1+=t[o].sum,s2=(s2+t[o].sum2)%mod,s3=(s3+t[o].sum3)%mod;
            return;
        }
        int mid=l+r>>1;
        if(y<=mid)query(ls(o),l,mid,x,y);
        else if(x>mid)query(rs(o),mid+1,r,x,y);
        else query(ls(o),l,mid,x,mid),query(rs(o),mid+1,r,mid+1,y);
    }
    
    void read_and_parse(){
        n=read(),m=read();
        for(int i=1;i<=n;i++)a[i]=read();
        root=build(1,n);
    }
    
    long long qs2(long long x){return x*(x+1)%mod*(2*x+1)%mod;}
    long long qs3(long long x){return x*(x+1)%mod*x%mod*(x+1)%mod;}
    
    void solve(){
        while(m--){
            int opt=read();
            if(opt==1){
                int pos=read(),val=read();
                modify(root,1,n,pos,val);
            }else if(opt==2){
                mi=inf,mx=-inf,s1=s2=s3=0;
                int l=read(),r=read();
                query(root,1,n,l,r);
                if(mx-mi!=r-l)puts("yuanxing");
                else if((mi+mx)*(r-l+1)/2!=s1)puts("yuanxing");
                else if(s2*6%mod!=((qs2(mx)-qs2(mi-1))%mod+mod)%mod)puts("yuanxing");
                else if(s3*4%mod!=((qs3(mx)-qs3(mi-1))%mod+mod)%mod)puts("yuanxing");
                else puts("damushen");
            }
        }
    }
    
    int main(){
        read_and_parse();
        solve();
        return 0;
    }
    
  • 相关阅读:
    脚手架 vue-cli
    vue文件添加编译
    客户合法性校验(密文hamc方法)
    socket的其他方法
    socket实现目录路径的相关操作
    socket实现OS的切换目录
    socket大文件传输(解决粘包)
    socket中的粘包理解
    socket实现在python中调用操作系统的命令(subprocess)
    socket实现文件的上传
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10433017.html
Copyright © 2020-2023  润新知