zoukankan      html  css  js  c++  java
  • HDU4027 (线段树/修改区间,询问区间和)

    lazy思想

    当一个数开了6到7次根号时,就变成1了。

    View Code
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #include<algorithm>
     5 #include<math.h>
     6 using namespace std;
     7 typedef __int64 int64;
     8 #define L( x ) (x<<1)
     9 #define R( x ) ((x<<1)+1)
    10 const int64 maxn = 100005;
    11 struct node{
    12     int64 l,r,num;
    13 }anode[ maxn*4 ];
    14 int64 data[ maxn ];
    15 
    16 void build( int64 l,int64 r,int64 n ){
    17     if( l==r ){
    18         anode[ n ].l=l,anode[ n ].r=r,anode[ n ].num=data[ l ];
    19         return ;
    20     }
    21     int64 mid;
    22     mid=( l+r )/2;
    23     anode[ n ].l=l,anode[ n ].r=r;
    24     build( l,mid,L( n ) );
    25     build( mid+1,r,R( n ));
    26     anode[ n ].num=anode[ L( n ) ].num+anode[ R( n ) ].num;
    27     return ;
    28 }//build the tree
    29 
    30 void update( int64 l,int64 r,int64 n ){
    31     if( anode[ n ].num==( anode[ n ].r-anode[ n ].l+1 ) ) return ;//一个数经过6,7次开根号就能变成1
    32     if( anode[ n ].l==anode[ n ].r ) {
    33         anode[ n ].num=sqrt( 1.0*anode[ n ].num );
    34         return ;
    35     }
    36     int64 mid;
    37     mid=( anode[ n ].l+anode[ n ].r )/2;
    38     if( mid>=r ) update( l,r,L( n ) );
    39     else if( mid<l ) update( l,r,R( n ) );
    40     else {update( l,mid,L( n ) );update( mid+1,r,R( n ) );}
    41     anode[ n ].num=anode[ L( n ) ].num+anode[ R( n ) ].num;
    42     return ;
    43 }
    44 
    45 int64 query( int64 l,int64 r,int64 n ){
    46     if( anode[ n ].l==l && anode[ n ].r==r ) return anode[ n ].num;
    47     int64 mid;
    48     mid=( anode[ n ].l+anode[ n ].r )/2;
    49     if( mid>=r ) return query( l,r,L( n ) );
    50     else if( mid<l ) return query( l,r,R( n ) );
    51     else return( query( l,mid,L( n ) )+query( mid+1,r,R( n ) ) );
    52 }
    53 
    54 int main(){
    55     int64 n;
    56     int64 ca=1;
    57     while( scanf("%I64d",&n)!=EOF ){
    58         printf("Case #%I64d:\n",ca++);
    59         for( int64 i=1;i<=n;i++ ){
    60             scanf("%I64d",&data[ i ]);
    61         }
    62         build( 1,n,1 );
    63         int64 tmp;
    64         scanf("%I64d",&tmp);
    65         while( tmp-- ){
    66             int64 temp,a,b;
    67             scanf("%I64d%I64d%I64d",&temp,&a,&b);
    68             int64 j;
    69             if(a>b){j=a;a=b;b=j;}
    70             if(temp==0)
    71                 update( a,b,1 );
    72             else
    73                 printf("%I64d\n",query( a,b,1 ));
    74         }
    75         printf("\n");
    76     }
    77     return 0;
    78 }
    keep moving...
  • 相关阅读:
    源码分析:①ReentrantLock之公平锁和非公平锁
    源码分析:同步基础框架——AbstractQueuedSynchronizer(AQS)
    java 同步锁:synchronized 关键字
    Java 中的锁优化
    Java 魔法类:Unsafe 解析
    实战:SpringBoot 2.3.0新特性之优雅停机
    实战:windows下使用docker部署springboot web demo项目
    版本控制SVN的使用笔记
    Maven项目管理:SpringMVC+Mybatis+Velocity整合笔记
    java常用集合总结
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2880296.html
Copyright © 2011-2022 走看看