博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

线段树

题目:https://www.luogu.org/problemnew/show/P3373

AC代码:

  1 #include<bits/stdc++.h>
  2 #include<vector>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<cstdio>
  6 #define ll unsigned long long
  7 using namespace std;;
  8 //const ll mod=1e9+7;
  9 const ll maxn=1000010;
 10 ll tree[maxn<<2];
 11 ll lz[maxn<<2],lz1[maxn<<2];
 12 ll mod;
 13 void build(ll l,ll r,ll p)
 14 {lz[p]=1;lz1[p]=0;
 15     if(l==r)
 16     {
 17         scanf("%lld",&tree[p]);
 18         return ;
 19     }
 20     ll mid=(l+r)>>1;
 21     build(l,mid,p<<1);
 22     build(mid+1,r,p<<1|1);
 23     tree[p]=(tree[p<<1]+tree[p<<1|1])%mod;
 24 }
 25 void down(ll l,ll r,ll p)
 26 {ll mid=(l+r)>>1;
 27     lz[p<<1]=(lz[p<<1]*lz[p])%mod;
 28     lz[p<<1|1]=(lz[p<<1|1]*lz[p])%mod;
 29     lz1[p<<1]=(lz1[p]+lz1[p<<1]*lz[p])%mod;
 30     lz1[p<<1|1]=(lz1[p]+lz1[p<<1|1]*lz[p])%mod;
 31     tree[p<<1]=(tree[p<<1]*lz[p]+(mid-l+1)*lz1[p])%mod;
 32     tree[p<<1|1]=(tree[p<<1|1]*lz[p]+(r-mid)*lz1[p])%mod;
 33     lz[p]=1;
 34     lz1[p]=0;
 35 }
 36 void add(ll l,ll r,ll x,ll y,ll p,ll k)
 37 {
 38     if(x<=l&&y>=r)
 39     {
 40         tree[p]=(tree[p]+(r-l+1)*k)%mod;
 41         lz1[p]=(lz1[p]+k)%mod;
 42         return ;
 43     }
 44      down(l,r,p);
 45      ll mid=(l+r)>>1;
 46      if(x<=mid)add(l,mid,x,y,p<<1,k);
 47      if(y>mid) add(mid+1,r,x,y,p<<1|1,k);
 48      tree[p]=tree[p<<1]+tree[p<<1|1];
 49 }
 50 void mu(ll l,ll r,ll x,ll y,ll p,ll k)
 51 {
 52     if(x<=l&&y>=r)
 53     {
 54         tree[p]=(tree[p]*k)%mod;
 55         lz[p]=(lz[p]*k)%mod;
 56         lz1[p]=(lz1[p]*k)%mod;
 57         return ;
 58     }
 59      down(l,r,p);
 60      ll mid=(l+r)>>1;
 61      if(x<=mid)mu(l,mid,x,y,p<<1,k);
 62      if(y>mid) mu(mid+1,r,x,y,p<<1|1,k);
 63      tree[p]=tree[p<<1]+tree[p<<1|1];
 64 }
 65 ll sum(ll x,ll y,ll l,ll r,ll p)
 66 { ll ans=0;
 67    if(x<=l&&y>=r)
 68     {
 69         return tree[p]%mod;
 70     }
 71      down(l,r,p);
 72      ll mid=(l+r)>>1;
 73      if(x<=mid)ans=(ans+sum(x,y,l,mid,p<<1))%mod;
 74      if(y>mid) ans=(ans+sum(x,y,mid+1,r,p<<1|1))%mod;
 75     return ans%mod;
 76 }
 77 void prll(ll l,ll r,ll p)
 78 {
 79     if(l==r)
 80     {
 81 
 82         return ;
 83     }
 84     down(l,r,p);
 85     ll mid=(l+r)>>1;
 86    prll(l,mid,p<<1);
 87     prll(mid+1,r,p<<1|1);
 88    
 89 }
 90 int main()
 91 {
 92     ll n,m;
 93     cin>>n>>m>>mod;
 94    build(1,n,1);
 95    while(m--)
 96    {
 97        ll a;
 98        scanf("%lld",&a);
 99        if(a==1)
100        {
101            ll x,y,k;
102            scanf("%lld%lld%lld",&x,&y,&k);
103            mu(1,n,x,y,1,k);
104          
105        }
106        else if(a==2)
107        {
108 
109            ll x,y,k;
110            scanf("%lld%lld%lld",&x,&y,&k);
111            add(1,n,x,y,1,k);
112           
113        }
114        else
115        { ll x,y;scanf("%lld%lld",&x,&y);
116            printf("%lld\n",sum(x,y,1,n,1));
117         
118    }
119 
120    }
121 }

 

posted @ 2019-05-20 17:28  GUET_uzi  阅读(100)  评论(0编辑  收藏  举报

- 创建于 2018年9月1日

这是一位ACM爱好者&数学爱好者的个人站,内容主要是算法&数据结构&数学研究的技术文章,大部分来自学习,部分来源于网络,希望对大家有所帮助。