• 线段树


    题目: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
    ",sum(x,y,1,n,1));
    117         
    118    }
    119 
    120    }
    121 }
  • 相关阅读:
    powershell 模拟IE行为
    php获取post中的json数据
    转:实例学习PHP程序对用户身份认证实现两种方法
    PHP中间件ICE
    常用的PHP数据库操作方法(MYSQL版)
    PHP 读取网页文件
    解决当distinct和join同时存在distinct失效问题
    web test LoadRunner web_reg_find / jianchadian / flag / placeflag
    my ReadHealth / drink / body cancer
    my ReadFood_Nanking Delicious / food / delicious
  • 原文地址:https://www.cnblogs.com/zxz666/p/10895362.html
Copyright © 2020-2023  润新知