zoukankan      html  css  js  c++  java
  • Transformation

    hdu4578:http://acm.hdu.edu.cn/showproblem.php?pid=4578

    题意:
    给一个序列 {an},有 4 种操作。
    1、将一段区间的数全部加 c。
    2、将一段区间的数全部乘 c。
    3、将一段区间的数全部等于 c。
    4、询问一段区间的和(和、平方和、立方和)。
    解题思路:
    这道题自己完全不会打,虽然知道思路。所以借鉴了大神的代码。

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <algorithm>
      4 using namespace std;
      5 const int N = 1e5 + 5;
      6 const int mod = 10007;
      7 #define lson u<<1
      8 #define rson u<<1|1
      9 
     10 inline int sqr2(int x){
     11     return x * x % mod;
     12 }
     13 
     14 inline int sqr3(int x){
     15     return sqr2(x) * x % mod;
     16 }
     17 
     18 struct SegTree{
     19     int l,r;
     20     int sum[4];
     21     int mul,add;
     22     inline int mid(){
     23         return (l+r)>> 1;
     24     }
     25     inline int len(){
     26         return r-l+1;
     27     }
     28     void flag_init(){
     29         add = 0, mul = 1;
     30     }
     31     void to_mul(int m){
     32         (sum[1] *= m) %= mod;
     33         (sum[2] *= sqr2(m)) %= mod;
     34         (sum[3] *= sqr3(m)) %= mod;
     35 
     36         (mul *= m) %= mod;
     37         (add *= m) %= mod;
     38     }
     39     void to_add(int a){
     40         (sum[3] += sqr3(a) * len()) %= mod;
     41         (sum[3] += 3 *  a    * sum[2]) %= mod;
     42         (sum[3] += 3 * sqr2(a) * sum[1]) %= mod;
     43 
     44         (sum[2] += sqr2(a) * len()) %= mod;
     45         (sum[2] += 2 * a  * sum[1]) %= mod;
     46 
     47         (sum[1] += a * len()) %= mod;
     48 
     49         (add += a) %= mod;
     50     }
     51 }T[N<<2];
     52 void build(int u,int l,int r){
     53     T[u].l = l , T[u].r = r;
     54     memset(T[u].sum,0,sizeof(T[u].sum));
     55     T[u].flag_init();
     56     if(l==r)
     57         return ;
     58     int m = T[u].mid();
     59     build(lson,l,m);
     60     build(rson,m+1,r);
     61 }
     62 int op;
     63 void push_down(int u){
     64     T[lson].to_mul(T[u].mul);
     65     T[rson].to_mul(T[u].mul);
     66     T[lson].to_add(T[u].add);
     67     T[rson].to_add(T[u].add);
     68     T[u].flag_init();
     69 }
     70 void push_up(int u){
     71   for(int i=1;i<=3;i++)
     72     T[u].sum[i] = (T[lson].sum[i] + T[rson].sum[i]) % mod;
     73 }
     74 
     75 void updata(int u,int l,int r,int mul,int add){
     76     if(T[u].l == l && T[u].r == r){
     77         T[u].to_mul(mul);
     78         T[u].to_add(add);
     79         return ;
     80     }
     81     push_down(u);
     82     int m = T[u].mid();
     83     if(r <= m)
     84         updata(lson,l,r,mul,add);
     85     else if(l >m)
     86         updata(rson,l,r,mul,add);
     87     else
     88         updata(lson,l,m,mul,add), updata(rson,m+1,r,mul,add);
     89     push_up(u);
     90 }
     91 int query(int u,int l,int r){
     92     if(T[u].l == l && T[u].r == r)
     93         return T[u].sum[op];
     94     push_down(u);
     95     int m = T[u].mid();
     96     if(r <= m)
     97         return query(lson,l,r);
     98     else if(l >m)
     99         return query(rson,l,r);
    100     else
    101         return (query(lson,l,m)+query(rson,m+1,r)) % mod;
    102 }
    103 
    104 int main(){
    105     int n,m,a,b,c;
    106     while(scanf("%d%d",&n,&m),n||m){
    107         build(1,1,n+1);
    108         while(m--){
    109             scanf("%d",&op);
    110             if(op == 4){
    111                 scanf("%d%d%d",&a,&b,&op);
    112                 printf("%d
    ",query(1,a,b));
    113             }
    114             else{
    115                 scanf("%d%d%d",&a,&b,&c);
    116                 if(op == 1)
    117                     updata(1,a,b,1,c);
    118                 else if(op == 2)
    119                     updata(1,a,b,c,0);
    120                 else
    121                     updata(1,a,b,0,c);
    122             }
    123         }
    124     }
    125     return 0;
    126 }
    View Code
  • 相关阅读:
    DPM(Deformable Part Model)原理详解(汇总)
    VS code配置docker的shell环境
    C++运算符重载规则
    typedef 和define的区别
    在ESP分区新建win10引导
    自动化学报投稿过程记录
    shell-grep命令详解(转)
    shell-sed命令详解(转)
    shell-命令行参数(转)
    sublimetext3-实用快捷键整理
  • 原文地址:https://www.cnblogs.com/chujian123/p/3739584.html
Copyright © 2011-2022 走看看