zoukankan      html  css  js  c++  java
  • hdu4578 Transformation 线段树

    Yuanfang is puzzled with the question below: 
    There are n integers, a1, a2, …, an. The initial values of them are 0. There are four kinds of operations.
    Operation 1: Add c to each number between ax and ay inclusive. In other words, do transformation ak<---ak+c, k = x,x+1,…,y.
    Operation 2: Multiply c to each number between ax and ay inclusive. In other words, do transformation ak<---ak×c, k = x,x+1,…,y.
    Operation 3: Change the numbers between ax and ay to c, inclusive. In other words, do transformation ak<---c, k = x,x+1,…,y.
    Operation 4: Get the sum of p power among the numbers between ax and ay inclusive. In other words, get the result of axp+ax+1p+…+ay p.
    Yuanfang has no idea of how to do it. So he wants to ask you to help him. 

    区间加、乘、改、求和,线段树,推出式子即可。

      1 #include<stdio.h>
      2 #include<string.h>
      3 const int mod=10007;
      4 const int maxm=100005;
      5 
      6 int st[4][maxm<<2],add[maxm<<2],mul[maxm<<2],cha[maxm<<2];
      7 
      8 void build(int o,int l,int r){
      9     st[1][o]=st[2][o]=st[3][o]=0;
     10     add[o]=cha[o]=0;
     11     mul[o]=1;
     12     if(l==r)return;
     13     int m=l+((r-l)>>1);
     14     build(o<<1,l,m);
     15     build(o<<1|1,m+1,r);
     16 }
     17 
     18 void pushdown(int o,int l,int r){
     19     if(cha[o]){
     20         cha[o<<1]=cha[o<<1|1]=cha[o];
     21         add[o<<1]=add[o<<1|1]=0;
     22         mul[o<<1]=mul[o<<1|1]=1;
     23         int m=l+((r-l)>>1);
     24         st[1][o<<1]=cha[o]*(m-l+1)%mod;
     25         st[1][o<<1|1]=cha[o]*(r-m)%mod;
     26         st[2][o<<1]=(cha[o]*cha[o]%mod)*(m-l+1)%mod;
     27         st[2][o<<1|1]=(cha[o]*cha[o]%mod)*(r-m)%mod;
     28         st[3][o<<1]=((cha[o]*cha[o]%mod)*cha[o]%mod)*(m-l+1)%mod;
     29         st[3][o<<1|1]=((cha[o]*cha[o]%mod)*cha[o]%mod)*(r-m)%mod;
     30         cha[o]=0;
     31     }
     32     if(add[o]||(mul[o]!=1)){
     33         int m=l+((r-l)>>1);
     34         add[o<<1]=(add[o<<1]*mul[o]%mod+add[o])%mod;
     35         mul[o<<1]=mul[o<<1]*mul[o]%mod;
     36         st[3][o<<1]=(
     37                 ((st[3][o<<1]*mul[o]%mod)*mul[o]%mod)*mul[o]%mod 
     38                 +(((st[2][o<<1]*mul[o]%mod)*mul[o]%mod)*add[o]%mod)*3%mod
     39                 +(((st[1][o<<1]*mul[o]%mod)*add[o]%mod)*add[o]%mod)*3%mod
     40                 +((add[o]*add[o]%mod)*add[o]%mod)*(m-l+1)%mod
     41                 )%mod;
     42         st[2][o<<1]=(
     43                 (st[2][o<<1]*mul[o]%mod)*mul[o]%mod
     44                 +((st[1][o<<1]*mul[o]%mod)*add[o]%mod)*2%mod
     45                 +(add[o]*add[o]%mod)*(m-l+1)%mod
     46                 )%mod;
     47         st[1][o<<1]=(
     48                 st[1][o<<1]*mul[o]%mod+add[o]*(m-l+1)%mod
     49                 )%mod;
     50         add[o<<1|1]=(add[o<<1|1]*mul[o]%mod+add[o])%mod;
     51         mul[o<<1|1]=mul[o<<1|1]*mul[o]%mod;
     52         st[3][o<<1|1]=(
     53                 ((st[3][o<<1|1]*mul[o]%mod)*mul[o]%mod)*mul[o]%mod 
     54                 +(((st[2][o<<1|1]*mul[o]%mod)*mul[o]%mod)*add[o]%mod)*3%mod
     55                 +(((st[1][o<<1|1]*mul[o]%mod)*add[o]%mod)*add[o]%mod)*3%mod
     56                 +((add[o]*add[o]%mod)*add[o]%mod)*(r-m)%mod
     57                 )%mod;
     58         st[2][o<<1|1]=(
     59                 (st[2][o<<1|1]*mul[o]%mod)*mul[o]%mod
     60                 +((st[1][o<<1|1]*mul[o]%mod)*add[o]%mod)*2%mod
     61                 +(add[o]*add[o]%mod)*(r-m)%mod
     62                 )%mod;
     63         st[1][o<<1|1]=(
     64                 st[1][o<<1|1]*mul[o]%mod+add[o]*(r-m)%mod
     65                 )%mod;
     66         add[o]=0;
     67         mul[o]=1;
     68     }
     69 }
     70 
     71 void update3(int o,int l,int r,int ql,int qr,int c){
     72     if(ql<=l&&qr>=r){
     73         st[1][o]=c*(r-l+1)%mod;
     74         st[2][o]=(c*c%mod)*(r-l+1)%mod;
     75         st[3][o]=((c*c%mod)*c%mod)*(r-l+1)%mod;
     76         cha[o]=c;
     77         add[o]=0;
     78         mul[o]=1;
     79         return;
     80     }
     81     pushdown(o,l,r);
     82     int m=l+((r-l)>>1);
     83     if(ql<=m)update3(o<<1,l,m,ql,qr,c);
     84     if(qr>=m+1)update3(o<<1|1,m+1,r,ql,qr,c);
     85     st[1][o]=(st[1][o<<1]+st[1][o<<1|1])%mod;
     86     st[2][o]=(st[2][o<<1]+st[2][o<<1|1])%mod;
     87     st[3][o]=(st[3][o<<1]+st[3][o<<1|1])%mod;
     88 }
     89 
     90 void update1(int o,int l,int r,int ql,int qr,int c){
     91     if(ql<=l&&qr>=r){
     92         add[o]=(add[o]+c)%mod;
     93         st[3][o]=(st[3][o]+(c*st[2][o]%mod)*3%mod+((st[1][o]*c%mod)*c%mod)*3%mod+((c*c%mod)*c%mod)*(r-l+1)%mod)%mod;
     94         st[2][o]=(st[2][o]+(c*st[1][o]%mod)*2%mod+(c*c%mod)*(r-l+1)%mod)%mod;
     95         st[1][o]=(st[1][o]+c*(r-l+1)%mod)%mod;
     96         return;
     97     }
     98     pushdown(o,l,r);
     99     int m=l+((r-l)>>1);
    100     if(ql<=m)update1(o<<1,l,m,ql,qr,c);
    101     if(qr>=m+1)update1(o<<1|1,m+1,r,ql,qr,c);
    102     st[1][o]=(st[1][o<<1]+st[1][o<<1|1])%mod;
    103     st[2][o]=(st[2][o<<1]+st[2][o<<1|1])%mod;
    104     st[3][o]=(st[3][o<<1]+st[3][o<<1|1])%mod;
    105 }
    106 
    107 void update2(int o,int l,int r,int ql,int qr,int c){
    108     if(ql<=l&&qr>=r){
    109         add[o]=add[o]*c%mod;
    110         mul[o]=mul[o]*c%mod;
    111         st[3][o]=((st[3][o]*c%mod)*c%mod)*c%mod;
    112         st[2][o]=(st[2][o]*c%mod)*c%mod;
    113         st[1][o]=st[1][o]*c%mod;
    114         return;
    115     }
    116     pushdown(o,l,r);
    117     int m=l+((r-l)>>1);
    118     if(ql<=m)update2(o<<1,l,m,ql,qr,c);
    119     if(qr>=m+1)update2(o<<1|1,m+1,r,ql,qr,c);
    120     st[1][o]=(st[1][o<<1]+st[1][o<<1|1])%mod;
    121     st[2][o]=(st[2][o<<1]+st[2][o<<1|1])%mod;
    122     st[3][o]=(st[3][o<<1]+st[3][o<<1|1])%mod;
    123 }
    124 
    125 int query(int o,int l,int r,int ql,int qr,int p){
    126     if(ql<=l&&qr>=r){
    127         return st[p][o];
    128     }
    129     pushdown(o,l,r);
    130     int m=l+((r-l)>>1);
    131     int ans=0;
    132     if(ql<=m)ans=(ans+query(o<<1,l,m,ql,qr,p))%mod;
    133     if(qr>=m+1)ans=(ans+query(o<<1|1,m+1,r,ql,qr,p))%mod;
    134     return ans;
    135 }
    136 
    137 int main(){
    138     int n,m;
    139     while(scanf("%d%d",&n,&m)!=EOF&&n+m){
    140         build(1,1,n);
    141         for(int i=1;i<=m;++i){
    142             int t,l,r,p;
    143             scanf("%d%d%d%d",&t,&l,&r,&p);
    144             if(t==1)update1(1,1,n,l,r,p);
    145             else if(t==2)update2(1,1,n,l,r,p);
    146             else if(t==3)update3(1,1,n,l,r,p);
    147             else if(t==4)printf("%d
    ",query(1,1,n,l,r,p));
    148         }
    149     }
    150     return 0;
    151 }
    View Code
  • 相关阅读:
    你了解RTOS吗?
    [转] git rebase 详解
    MinGW vs MinGW-W64及其它
    【转】Video Rendering with 8-Bit YUV Formats
    Ubuntu假死
    渐进增强和优雅降级的区别
    JavaScript 插件的学习
    菜单的制作
    生活
    小组学习情况
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/6598413.html
Copyright © 2011-2022 走看看