zoukankan      html  css  js  c++  java
  • hdu 5239 Doom

    题意:给n个数,每次查询[l,r]的和,然后[l,r]之间的数都会由ai变为ai^2,开始计数器为0,每次在上一次的基础上,为计数器+sum[l,r],答案%9223372034707292160

    分析:猜想一个数的平方%p应该会很快进入静止,即ai^2%p=ai,这样这个数就不会更新,用java跑了一发,发现最多更新29次,其实这个无所谓,猜想到这个性质就可以了,然后就是解决下一个问题,mod^2很大,long long也存不下,解决了这个问题,我想剩下的就很简单了,a*a=a个a相加,使用类似于快速幂的形式,求a个a相加并对mod取模的值,用一个lay[rt]表示该节点代表的子树不会被更新,这样就Ok了,裸的线段树

    #include<bits/stdc++.h>
    #define mmid int mid=(l+r)>>1
    #define lson rt*2
    #define rson rt*2+1
    using namespace std;
    typedef long long ll;
    const ll mod=9223372034707292160LL;
    const int maxn=1e5+5;
    ll sum[maxn<<2];
    bool lay[maxn<<2];
    int ql,qr;
    inline bool isdight(char c){return c>='0'&&c<='9';}
    
    void read(ll &res){
        char c=getchar();
        res=0;
        while(!isdight(c))c=getchar();
        while(isdight(c))res=res*10+c-'0',c=getchar();
    }
    
    void read(int &res){
        char c=getchar();
        res=0;
        while(!isdight(c))c=getchar();
        while(isdight(c))res=res*10+c-'0',c=getchar();
    }
    
    inline void Mod(ll &x){if(x>=mod)x%=mod;}
    
    void build(int rt,int l,int r){
        lay[rt]=0;
        if(l==r){
            read(sum[rt]);//scanf("%lld",sum+rt);
            return ;
        }
        mmid;
        build(lson,l,mid);
        build(rson,mid+1,r);
        sum[rt]=(sum[lson]+sum[rson]);Mod(sum[rt]);
    }
    
    ll pow_add(ll a){
        ll res=0,t=a,k=a;
        while(k){
            if(k&1)res=(t+res),Mod(res);
            t=(t+t);Mod(t);
            k=k>>1;
        }
        return res;
    }
    
    ll query(int rt,int l,int r){
        if(ql<=l&&qr>=r)return sum[rt];
        mmid;
        ll res=0;
        if(ql<=mid)res=(res+query(lson,l,mid)),Mod(res);
        if(qr>mid)res=(res+query(rson,mid+1,r)),Mod(res);
        return res;
    }
    
    void modify(int rt,int l,int r){
    
        if(lay[rt])return ;
        if(l==r){
            ll t=pow_add(sum[rt]);
            if(t==sum[rt])lay[rt]=1;
            else sum[rt]=t;
            return ;
        }
        mmid;
        if(ql<=mid&&!lay[lson])modify(lson,l,mid);
        if(qr>mid&&!lay[rson])modify(rson,mid+1,r);
        lay[rt]=(lay[lson]|lay[rson]);
        sum[rt]=(sum[lson]+sum[rson]);Mod(sum[rt]);
    }
    
    int main(){
    
        int t,n,q,cas=1,l,r;
        read(t);
        while(t--){
            read(n);read(q);
            build(1,1,n);
            printf("Case #%d:
    ",cas++);
            ll s=0;
            while(q--){
                read(ql);read(qr);
                s=(s+query(1,1,n));Mod(s);
                printf("%lld
    ",s);
                modify(1,1,n);
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    Photoshop教程,视频MP4格式转换为GIF格式
    pyqgis环境配置
    R 输出函数 格式化输出 打印函数
    linux ubuntu 更改终端的默认设置,终端大小,字体
    wps 显示所有的字符,将参考文献排序,插入目录
    在 word 中 怎么让表格旋转方向
    linux argc argv
    linux 命令行的快捷键 vim
    linux 操作系统,以及一般的操作系统 所看书籍
    win 10 快速启动 某些程序
  • 原文地址:https://www.cnblogs.com/jihe/p/6786485.html
Copyright © 2011-2022 走看看