zoukankan      html  css  js  c++  java
  • hdu--4027--不错的线段树

    这题 蛮好的 如果用心去感受<讲得好像太文艺了>

    不知道 你们有没有想过为什么 有时候进行区间更新操作的时候 可以直接对整个区间进行操作 而不必要一个点 一个点地去更新

    因为 我们对这个区间内的每个数 都是相同的操作 所以可以放在一起操作 就像一起+- K什么的

    但这里呢 是对[ L , R ]这个区间内的每一个元素 开平方  我们只能一个点 一个点地更新.

    那你可能会想 这样我们就发挥不了线段树的优势了啊 和for遍历一样了

    我们还是可以运用下 标记  虽然不是延迟更新的思想 但效果上也能节省很多时间

    我们知道<1,3>无限开平方 下去 永远都是1  所以这是没必要的  我们就应该标记出这些特殊数据

    orz...11.11 分手半年多了 我要摆脱单身了吗?

      1 #include <iostream>
      2 #include <cmath>
      3 #include <algorithm>
      4 using namespace std;
      5 
      6 typedef long long LL;
      7 const int size = 100010;
      8 struct data
      9 {
     10     int L;
     11     int R;
     12     bool flag;//判断是否为1
     13     LL sum;
     14 }tree[size*4];
     15 
     16 void pushUp( int root )
     17 {
     18     tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
     19     tree[root].flag = tree[root<<1].flag && tree[root<<1|1].flag;
     20 }
     21 
     22 void build( int root , int L , int R )
     23 {
     24     int Mid = ( L + R ) >> 1;
     25     tree[root].L = L;
     26     tree[root].R = R;
     27     tree[root].flag = false;
     28     if( L == R )
     29     {
     30         cin >> tree[root].sum;
     31         if( tree[root].sum<=1 )
     32             tree[root].flag = true;
     33         return ;
     34     }
     35     build( root<<1 , L , Mid );
     36     build( root<<1|1 , Mid+1 , R );
     37     pushUp( root );
     38 }
     39 
     40 void update( int root , int L , int R )
     41 {
     42     int Mid = ( tree[root].L + tree[root].R ) >> 1;
     43     if( tree[root].flag )
     44         return;
     45     if( tree[root].L  == L && tree[root].R == R && L == R )
     46     {
     47         tree[root].sum = (LL)sqrt( tree[root].sum*1.0 );
     48         if( tree[root].sum <= 1 )
     49         {
     50             tree[root].flag = true;
     51         }
     52         return ;
     53     }
     54     if( R<=Mid )
     55         update( root<<1 , L , R );
     56     else if( L>=Mid+1 )
     57         update( root<<1|1 , L , R );
     58     else
     59     {
     60         update( root<<1 , L , Mid );
     61         update( root<<1|1 , Mid+1 , R );
     62     }
     63     pushUp( root );
     64 }
     65 
     66 LL query( int root , int L , int R )
     67 {
     68     int Mid = ( tree[root].L + tree[root].R ) >> 1;
     69     LL ans = 0;
     70     if( tree[root].L == L && tree[root].R == R )
     71     {
     72         return tree[root].sum ;
     73     }
     74     if( R<=Mid )
     75         ans += query( root<<1 , L , R );
     76     else if( L>=Mid+1 )
     77         ans += query( root<<1|1 , L , R );
     78     else
     79     {
     80         ans += query( root<<1 , L , Mid );
     81         ans += query( root<<1|1 , Mid+1 , R );
     82     }
     83     return ans;
     84 }
     85 
     86 int main()
     87 {
     88     cin.sync_with_stdio(false);
     89     int n , m , op , x , y;
     90     int cnt = 1;
     91     while( cin >> n )
     92     {
     93         build( 1 , 1 , n );
     94         cin >> m;
     95         cout << "Case #" << cnt++ << ":" << endl;
     96         while( m-- )
     97         {
     98             cin >> op >> x >> y;
     99             if( x>y )
    100                 swap( x , y );
    101             if( !op )
    102             {
    103                 update( 1 , x , y );
    104             }
    105             else
    106             {
    107                 cout << query( 1 , x , y ) << endl;
    108             }
    109         }
    110         cout << endl;
    111     }
    112     return 0;
    113 }
    View Code

    today:

      科比 布莱恩特

      无需多言

      老大

    just follow your heart
  • 相关阅读:
    结对开发第一阶段,10天冲刺第十天
    结对开发第一阶段,10天冲刺第九天
    vim 编辑器
    用户、群组和权限
    硬盘分区、格式化及文件系统管理
    系统监控
    Linux 系统初始化和服务
    文件合并与打包
    计算机原理
    Linux 之添加系统环境变量
  • 原文地址:https://www.cnblogs.com/radical/p/4077268.html
Copyright © 2011-2022 走看看