zoukankan      html  css  js  c++  java
  • BZOJ 3211 题解

    3211: 花神游历各国

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 2549  Solved: 946
    [Submit][Status][Discuss]

    Description

     

    Input

     

    Output

    每次x=1时,每行一个整数,表示这次旅行的开心度

    Sample Input

    4
    1 100 5 5
    5
    1 1 2
    2 1 2
    1 1 2
    2 2 3
    1 1 4

    Sample Output

    101
    11
    11

    HINT

    对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9

    Solution

    区间开根号看似十分难处理,实际不妨找规律。data[ i ] 的值最大为109

    ( 109 )½ = 105

    ( ( 109 )½)½ = 103

    ( ( ( 109 )½ )½ )½  = 102

    ( ( ( ( 109 )½ )½ )½ )½  = 101

    ( ( ( ( ( 109 )½ )½ )½ )½ )½  = 1 

    一个很大的数,五次根号后全部是1,当某个区间的值被开过5次根号,那么该区间所有值都是1.

    根据以上结论,不难写出代码。

     1 /**************************************************************
     2     Problem: 3211
     3     User: shadowland
     4     Language: C++
     5     Result: Accepted
     6     Time:1568 ms
     7     Memory:40372 kb
     8 ****************************************************************/
     9 
    10 #include "bits/stdc++.h"
    11  
    12 using namespace std ;
    13 typedef long long QAQ ;
    14 struct SegTree { int l , r , sqr ; QAQ sum ; } ; 
    15 const int maxN = 500100 ;
    16 
    17 SegTree tr[ maxN << 2 ] ;
    18 
    19 void Push_up ( const int i ) {
    20         tr[ i ].sum = tr[ i << 1 ].sum + tr[ i << 1 | 1 ].sum ;
    21 }
    22 
    23 int INPUT ( ) {
    24         int x = 0 , f = 1 ; char ch = getchar ( ) ;
    25         while ( ch < '0' || ch > '9' ) { if ( ch == '-' ) f = - 1 ; ch = getchar ( ) ; }
    26         while ( ch >= '0' && ch <='9' ) { x = ( x << 1 ) + ( x << 3 ) + ch - '0' ; ch = getchar ( ) ; }
    27         return x * f ;
    28 }
    29 
    30 void Build_Tree ( const int x , const int y , const int i ) {
    31         tr[ i ].l = x ; tr[ i ].r = y ;
    32         if ( x == y ) tr[ i ].sum = INPUT ( ) ;
    33         else {
    34                 int mid = ( tr[ i ].l + tr[ i ].r ) >> 1 ;
    35                 Build_Tree ( x , mid , i << 1 ) ;
    36                 Build_Tree ( mid + 1 , y , i << 1 | 1 ) ;
    37                 Push_up ( i ) ;
    38         }
    39 }
    40 void Update_Tree ( const int q , const int w , const int i ) {
    41         if ( q <= tr[ i ].l && tr[ i ].r <= w  ) {
    42                 ++ tr[ i ].sqr ;
    43                 if ( tr[ i ].l == tr[ i ].r ) {
    44                         tr[ i ].sum = sqrt ( tr[ i ].sum ) ;
    45                         return ;
    46                 }
    47         }
    48         
    49         int mid = ( tr[ i ].l + tr[ i ].r ) >> 1 ;
    50         if ( tr[ i ].sqr <= 5 ) {
    51                 if ( q > mid ) Update_Tree ( q , w , i << 1 | 1 ) ;
    52                 else if ( w <= mid ) Update_Tree ( q , w , i << 1 ) ;
    53                 else {
    54                         Update_Tree ( q , w , i << 1 | 1 ) ;
    55                         Update_Tree ( q , w , i << 1 ) ;
    56                 }
    57                 Push_up ( i ) ;
    58         }
    59         
    60 }
    61 
    62 QAQ Query_Tree ( const int q , const int w , const int i ) {
    63         if ( q <= tr[ i ].l && tr[ i ].r <= w ) {
    64                 return tr[ i ].sum ;
    65         }
    66         else {
    67                 int mid = ( tr[ i ].l + tr[ i ].r ) >> 1 ;
    68                 if ( q > mid ) return Query_Tree ( q , w , i << 1 | 1) ;
    69                 else if ( w <= mid ) return Query_Tree ( q , w , i << 1 ) ;
    70                 else return Query_Tree ( q , w , i << 1 | 1 ) + Query_Tree ( q , w , i << 1 ) ;
    71         }
    72 }
    73 
    74 int main ( ) {
    75         int N = INPUT ( ) ;
    76         Build_Tree ( 1 , N , 1 ) ;
    77         int Q = INPUT( ) ;
    78         while ( Q-- ) {
    79                 int op = INPUT ( ) ;
    80                 if( op == 1 ) {
    81                         int l = INPUT( ) , r = INPUT( ) ;
    82                         printf ( "%lld
    " , Query_Tree ( l , r , 1 ) ) ;
    83                 } 
    84                 else if ( op == 2 ) {
    85                         int l = INPUT ( ) , r = INPUT ( ) ;
    86                         Update_Tree ( l , r , 1 ) ;
    87                 }
    88         }
    89         return 0 ;
    90 }
    View Code

    2016-10-13 22:10:52

    ()

  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/shadowland/p/5958364.html
Copyright © 2011-2022 走看看