zoukankan      html  css  js  c++  java
  • AHOI 2009 (BZOJ1798)维护序列 seq (线段树好题?)

    我是不会说这个题很坑的。。
    改了一晚上。。。
    这里写图片描述

    // by SiriusRen
    #include <cstdio>
    #define N 150000
    #define LSON l,mid,lson
    #define RSON mid+1,r,rson
    #define LL long long
    using namespace std;
    LL n,m,mod,xx,yy,zz,jy;
    LL mul[N*4],add[N*4],sum[N*4];
    int get(){
        int x=0;char p=getchar();
        while(p<'0'||p>'9')p=getchar();
        while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();
        return x;
    }
    void build(int l,int r,int pos){
        mul[pos]=1;
        if(l==r){sum[pos]=get();return;}
        int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
        build(LSON);build(RSON);
        sum[pos]=(sum[lson]+sum[rson])%mod;
    }
    void push_down(int pos,int lson,int rson,int num){
        mul[lson]=(mul[pos]*mul[lson])%mod;
        mul[rson]=(mul[pos]*mul[rson])%mod;
        add[lson]=(add[lson]*mul[pos]+add[pos])%mod;
        add[rson]=(add[rson]*mul[pos]+add[pos])%mod;
        sum[lson]=(sum[lson]*mul[pos]+add[pos]*(num-(num>>1)))%mod;
        sum[rson]=(sum[rson]*mul[pos]+add[pos]*(num>>1))%mod;
        mul[pos]=1;add[pos]=0;
    }
    void update(int l,int r,int pos){
        if(l>=xx&&r<=yy){
            if(jy==1){
                mul[pos]=(mul[pos]*zz)%mod;
                add[pos]=(add[pos]*zz)%mod;
                sum[pos]=(sum[pos]*zz)%mod;
            }
            else{
                add[pos]=(add[pos]+zz)%mod;
                sum[pos]=(sum[pos]+(r-l+1)*zz)%mod; 
            }
            return;
        }
        int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
        if(mul[pos]!=1||add[pos])
            push_down(pos,lson,rson,r-l+1);
        if(mid>=xx)update(LSON);
        if(mid<yy)update(RSON);
        sum[pos]=(sum[lson]+sum[rson])%mod;
    }
    int query(int l,int r,int pos){
        int mid=(l+r)/2,lson=pos<<1,rson=pos<<1|1;
        if(l>=xx&&r<=yy){
            return sum[pos];
        }
        if(mul[pos]!=1||add[pos])
            push_down(pos,lson,rson,r-l+1);
        if(mid>=yy)return query(LSON);
        else if(mid<xx)return query(RSON);
        else return (query(LSON)+query(RSON))%mod;
    }
    int main(){
        n=get();mod=get();
        build(1,n,1);
        m=get();
        while(m--){
            jy=get();xx=get();yy=get();
            if(jy!=3) zz=get(),update(1,n,1);
            else printf("%d
    ",query(1,n,1));
        }
    }

    这里写图片描述

  • 相关阅读:
    hdu 5087(次长上升子序列)
    hdu 5086(递推)
    hdu 5084(矩阵操作)
    hdu 5083(模拟)
    hdu 5082(水题)
    高数准备:
    ★ phpStudy安装SSL证书实现https链接
    phpStudy环境安装SSL证书教程
    Qt中切换窗口功能的实现
    LeetCode OJ:Reverse Linked List II(反转链表II)
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532420.html
Copyright © 2011-2022 走看看