• POJ---线段树---=-=


    应该是今夜的世界杯前的最后一题了吧

    又是个区间更新-增减 区间查询-求和 类型的题目

    连废话都不想打上去了  有点烦那

    touch me

      1 // 线段树  区间更新--增减 区间查询--求和
      2 
      3 #include <iostream>
      4 using namespace std;
      5 
      6 const int size = 100010;
      7 typedef long long LL; 
      8 LL ans;
      9 struct data
     10 {
     11     int l;
     12     int r;
     13     LL flag;
     14     LL sum;
     15 }tree[size*3];
     16 
     17 void create( int root , int l , int r )
     18 {
     19     int mid = (l+r)>>1;
     20     tree[root].l = l;
     21     tree[root].r = r;
     22     tree[root].flag = 0;
     23     if( l==r )
     24     {
     25         scanf( "%lld",&tree[root].sum );
     26         return;
     27     }    
     28     create( root<<1 , l , mid );
     29     create( root<<1|1 , mid+1 , r );
     30     tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
     31 }
     32 
     33 void pushDown( int root , int len )
     34 {
     35     tree[root<<1].flag += tree[root].flag;
     36     tree[root<<1].sum+=(len-len/2)*tree[root].flag;
     37     tree[root<<1|1].flag += tree[root].flag;
     38     tree[root<<1|1].sum+=(len/2)*tree[root].flag;
     39     tree[root].flag = 0;
     40 }
     41 
     42 void update( int root , int L , int R , LL num )
     43 {
     44     int mid = ( tree[root].l + tree[root].r )>>1;
     45     if( tree[root].l>=L && tree[root].r<=R )
     46     {
     47         tree[root].sum+=num*(tree[root].r-tree[root].l+1);        
     48         tree[root].flag += num;
     49         return;
     50     }
     51     if( tree[root].flag!=0 )
     52     {
     53         pushDown( root , (tree[root].r-tree[root].l+1) );
     54     }
     55     if( L<=mid )
     56     {
     57         update( root<<1 , L , R , num );
     58     }
     59     if( R>=mid+1 )
     60     {
     61         update( root<<1|1 , L , R , num );
     62     }
     63     tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
     64 }
     65 
     66 void query( int root , int L , int R )
     67 {
     68     int mid = ( tree[root].l+tree[root].r )>>1;
     69     if( tree[root].l>=L && tree[root].r<=R )
     70     {
     71         ans+=tree[root].sum;
     72         return; 
     73     }
     74     if( tree[root].flag!=0 )
     75     {
     76         pushDown( root , (tree[root].r-tree[root].l+1) );
     77     }
     78     if( L<=mid )
     79     {
     80         query( root<<1 , L , R );
     81     }
     82     if( R>=mid+1 )
     83     {
     84         query( root<<1|1 , L , R );
     85     }
     86     tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
     87 }
     88 
     89 int main()
     90 {
     91     int L , R;
     92     int n , m;
     93     LL num;
     94     char ch;
     95     while( ~scanf("%d %d",&n,&m) )
     96     {
     97         create( 1 , 1 , n );
     98         while( m-- )
     99         {
    100             getchar();
    101             scanf( "%c",&ch );
    102             if( ch == 'C' )
    103             {
    104                 scanf( "%d %d %lld",&L,&R,&num );
    105                 update( 1 , L , R , num );
    106             }
    107             else
    108             {
    109                 ans = 0;
    110                 scanf( "%d %d",&L,&R );
    111                 query( 1 , L , R );
    112                 printf( "%lld
    ",ans );
    113             }
    114         }        
    115     }
    116     return 0;
    117 } 
    View Code
    just follow your heart
  • 相关阅读:
    华为设备SNMP配置
    Linux CP直接覆盖快速操作
    CentOS7快速安装PHP7.0指南
    Linux SSH免密码登录配置
    this的指向
    分页的模块layui
    multer中间件
    ajax实现图片上传
    MVC模式、加密、jsonwebtoken
    mongoose与express
  • 原文地址:https://www.cnblogs.com/radical/p/3825261.html
Copyright © 2020-2023  润新知