• hdu 4578 Transformation


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

    题意:1,a,b,c代表在a,b区间的每一个数加上c;2,a,b,c代表在a,b区间的每一个数乘上c; 3,a,b,c代表在a,b区间的每一个数变为c;4,a,b,c是求在a,b区间的每一个数的c次方的和。

    先乘后加。

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #define maxn 100010
      5 using namespace std;
      6 
      7 int n,m;
      8 struct node
      9 {
     10     int r,l;
     11     int sum;
     12     int add;
     13     int mul;
     14     int sum2;
     15     int sum3;
     16 }tree[maxn*6];
     17 
     18 void build(int i,int l,int r)
     19 {
     20     tree[i].l=l;
     21     tree[i].r=r;
     22     tree[i].sum=0;
     23     tree[i].add=0;
     24     tree[i].mul=1;
     25     tree[i].sum2=0;
     26     tree[i].sum3=0;
     27     if(l==r) return ;
     28     int mid=(l+r)>>1;
     29     build(i<<1,l,mid);
     30     build(i<<1|1,mid+1,r);
     31 }
     32 
     33 void mull(int i,int data1,int data)
     34 {
     35     (tree[i].sum*=data1)%=10007;
     36     tree[i].sum2=tree[i].sum2*data1%10007*data1%10007;
     37     tree[i].sum3=tree[i].sum3*data1%10007*data1%10007*data1%10007;
     38     (tree[i].mul*=data1)%=10007;
     39     (tree[i].add*=data1)%=10007;
     40     (tree[i].sum3+=((tree[i].r-tree[i].l+1)%10007*(data%10007*data%10007*data%10007)))%=10007;
     41     (tree[i].sum3+=3*data%10007*tree[i].sum2%10007)%=10007;
     42     (tree[i].sum3+=(3*data%10007*data%10007*tree[i].sum%10007))%=10007;
     43     (tree[i].sum2+=(tree[i].r-tree[i].l+1)*(data*data%10007)%10007)%=10007;
     44     (tree[i].sum2+=(2*data%10007*tree[i].sum%10007))%=10007;
     45     (tree[i].sum+=(tree[i].r-tree[i].l+1)%10007*data%10007)%=10007;
     46     (tree[i].add+=data)%=10007;
     47 }
     48 void down(int i)
     49 {
     50     if(tree[i].l==tree[i].r) return ;
     51     mull(i<<1,tree[i].mul,tree[i].add);
     52     mull(i<<1|1,tree[i].mul,tree[i].add);
     53     tree[i].add=0;
     54     tree[i].mul=1;
     55 }
     56 void update(int i,int l,int r,int data1,int data)
     57 {
     58     if(tree[i].l==l&&tree[i].r==r)
     59     {
     60         mull(i,data1,data);
     61         return ;
     62     }
     63     down(i);
     64     int mid=(tree[i].l+tree[i].r)>>1;
     65     if(r<=mid)
     66     {
     67         update(i<<1,l,r,data1,data);
     68     }
     69     else if(l>mid)
     70     {
     71         update(i<<1|1,l,r,data1,data);
     72     }
     73     else
     74     {
     75         update(i<<1,l,mid,data1,data);
     76         update(i<<1|1,mid+1,r,data1,data);
     77     }
     78     tree[i].sum=(tree[i<<1].sum+tree[i<<1|1].sum)%10007;
     79     tree[i].sum2=(tree[i<<1].sum2+tree[i<<1|1].sum2)%10007;
     80     tree[i].sum3=(tree[i<<1].sum3+tree[i<<1|1].sum3)%10007;
     81 }
     82 
     83 int search1(int i,int l,int r,int ch)
     84 {
     85     if(tree[i].l==l&&tree[i].r==r)
     86     {
     87         if(ch==1)
     88             return tree[i].sum;
     89         else if(ch==2)
     90             return tree[i].sum2;
     91         else if(ch==3)
     92             return tree[i].sum3;
     93     }
     94     down(i);
     95     int mid=(tree[i].l+tree[i].r)>>1;
     96     if(r<=mid)
     97     {
     98         return search1(i<<1,l,r,ch);
     99     }
    100     else  if(l>mid)
    101     {
    102         return search1(i<<1|1,l,r,ch);
    103     }
    104     else
    105     {
    106         return (search1(i<<1,l,mid,ch)+search1(i<<1|1,mid+1,r,ch))%10007;
    107     }
    108 }
    109 
    110 int main()
    111 {
    112     while(scanf("%d%d",&n,&m)!=EOF)
    113     {
    114         if(n==0&&m==0) break;
    115         build(1,1,n);
    116         for(int i=1; i<=m; i++)
    117         {
    118             int x,y,op,c;
    119             scanf("%d%d%d%d",&op,&x,&y,&c);
    120             if(op==1)
    121             {
    122                 update(1,x,y,1,c);
    123             }
    124             else if(op==2)
    125             {
    126                 update(1,x,y,c,0);
    127             }
    128             else if(op==3)
    129             {
    130                 update(1,x,y,0,c);
    131             }
    132             else if(op==4)
    133             {
    134                 printf("%d
    ",search1(1,x,y,c)%10007);
    135             }
    136         }
    137     }
    138     return 0;
    139 }
    View Code
  • 相关阅读:
    SNMP概述–运维必知的协议基础
    关于多线程情况下Net-SNMP v3 版本导致进程假死情况的跟踪与分析
    关于snmp octet string和普通string问题
    SVN状态说明
    SNMP mib文件说明
    Linux之 proc文件系统
    django .all .values .value_list 数据库获取数据
    Django form验证
    JSONP实现
    iframe和form表单实现ajax请求上传数据
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3912216.html
Copyright © 2020-2023  润新知