• hdu 4578 Transformation 线段树


    没什么说的裸线段树,注意细节就好了!!!

    代码如下:

      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<algorithm>
      4 #include<iomanip>
      5 #include<cmath>
      6 #include<cstring>
      7 #include<vector>
      8 #define ll __int64
      9 #define pi acos(-1.0)
     10 #define MAX 100003
     11 #define M 10007
     12 #define lson i<<1
     13 #define rson i<<1|1
     14 using namespace std;
     15 struct tree
     16 {
     17     int l,r,sum[3],add,mul;
     18     void init(int _l,int _r){
     19         l=_l;r=_r;mul=1;add=0;
     20     }
     21     void Add(int a){
     22         sum[2]=(sum[2]+a*a%M*a%M*len()%M+3*a*sum[1]%M+3*a*a%M*sum[0]%M)%M;
     23         sum[1]=(sum[1]+a*a%M*len()%M+2*a*sum[0]%M)%M;
     24         sum[0]=(sum[0]+a*len()%M)%M;
     25         add=(add+a)%M;
     26     }
     27     void Mul(int a){
     28         sum[2]=sum[2]*a%M*a%M*a%M;
     29         sum[1]=sum[1]*a%M*a%M;
     30         sum[0]=sum[0]*a%M;
     31         add=add*a%M;
     32         mul=mul*a%M;
     33     }
     34     int len(){
     35         return r-l+1;
     36     }
     37     int mid(){
     38         return (l+r)>>1;
     39     }
     40 }T[MAX*4];
     41 void down(int i)
     42 {
     43     T[lson].Mul(T[i].mul);
     44     T[rson].Mul(T[i].mul);
     45     T[lson].Add(T[i].add);
     46     T[rson].Add(T[i].add);
     47     T[i].add=0;
     48     T[i].mul=1;
     49 }
     50 void updateson(int i)
     51 {
     52     for(int j=0;j<3;j++)
     53         T[i].sum[j]=(T[lson].sum[j]+T[rson].sum[j])%M;
     54 }
     55 void built(int i,int l,int r)
     56 {
     57     T[i].init(l,r);
     58     memset(T[i].sum,0,sizeof(T[i].sum));
     59     if(l==r) return ;
     60     int m=T[i].mid();
     61     built(lson,l,m);
     62     built(rson,m+1,r);
     63 }
     64 void update(int i,int l,int r,int mul,int add)
     65 {
     66     if(T[i].l==l&&T[i].r==r){
     67         T[i].Mul(mul);
     68         T[i].Add(add);
     69         return ;
     70     }
     71     down(i);
     72     int m=T[i].mid();
     73     if(r<=m) update(lson,l,r,mul,add);
     74     else if(l>m) update(rson,l,r,mul,add);
     75     else{
     76         update(lson,l,m,mul,add);
     77         update(rson,m+1,r,mul,add);
     78     }
     79     updateson(i);
     80 }
     81 int query(int i,int l,int r,int p)
     82 {
     83     if(T[i].l==l&&T[i].r==r) return T[i].sum[p-1];
     84     down(i);
     85     int m=T[i].mid();
     86     if(r<=m) return query(lson,l,r,p);
     87     else if(l>m) return query(rson,l,r,p);
     88     else return (query(lson,l,m,p)+query(rson,m+1,r,p))%M;
     89 }
     90 int main(){
     91     int m,n,op,x,y,p;
     92     while(scanf("%d%d",&n,&m)&&(m+n)){
     93         built(1,1,n);
     94         while(m--){
     95             scanf("%d%d%d%d",&op,&x,&y,&p);
     96             if(op==1) update(1,x,y,1,p);
     97             else if(op==2) update(1,x,y,p,0);
     98             else if(op==3) update(1,x,y,0,p);
     99             else printf("%d
    ",query(1,x,y,p)%M);
    100         }
    101     }
    102     return 0;
    103 }
    View Code
  • 相关阅读:
    [转]QTP 怎样连接mysql数据库操作
    [转]使用Eclipse来开发Android源码
    组合排序
    插入排序
    冒泡排序
    选择排序
    计数排序
    希尔排序
    合并排序
    鸡尾酒排序
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3278688.html
Copyright © 2020-2023  润新知