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\n",search1(1,x,y,c)%10007);
135             }
136         }
137     }
138     return 0;
139 }
View Code

 

posted @ 2014-08-14 11:47  null1019  阅读(193)  评论(0编辑  收藏  举报