zoukankan      html  css  js  c++  java
  • poj 2104 划分树模板

    划分树的模板题。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdio>
     4 using namespace std;
     5 
     6 const int N = 100001;
     7 int tree[20][N];
     8 int sum[20][N];
     9 int as[N];
    10 
    11 void build( int p, int l, int r )
    12 {
    13     int mid = ( ( l + r ) >> 1 );
    14     int lm = 0, ls = l, rs = mid + 1;
    15     for ( int i = mid; i >= l; i-- )
    16     {
    17         if ( as[i] == as[mid] )
    18             lm++;
    19         else
    20             break;
    21     }
    22     for ( int i = l; i <= r; i++ )
    23     {
    24         if ( i == l )
    25             sum[p][i] = 0;
    26         else
    27             sum[p][i] = sum[p][i - 1];
    28         if ( tree[p][i] == as[mid] )
    29         {
    30             if ( lm )
    31             {
    32                 lm--;
    33                 sum[p][i]++;
    34                 tree[p + 1][ls++] = tree[p][i];
    35             }
    36             else
    37             {
    38                 tree[p + 1][rs++] = tree[p][i];
    39             }
    40         }
    41         else if ( tree[p][i] < as[mid] )
    42         {
    43             sum[p][i]++;
    44             tree[p + 1][ls++] = tree[p][i];
    45         }
    46         else
    47         {
    48             tree[p + 1][rs++] = tree[p][i];
    49         }
    50     }
    51     if ( l == r )
    52         return ;
    53     build( p + 1, l, mid );
    54     build( p + 1, mid + 1, r );
    55 }
    56 
    57 int query( int p, int l, int r, int ql, int qr, int k )
    58 {
    59     if ( l == r )
    60         return tree[p][l];
    61     int mid = ( ( l + r ) >> 1 );
    62     int s, ss;
    63     if ( ql == l )
    64         s = 0, ss = sum[p][qr];
    65     else
    66         s = sum[p][ql - 1], ss = sum[p][qr] - s;
    67     if ( k <= ss )
    68         return query( p + 1, l, mid, l + s, l + sum[p][qr] - 1, k );
    69     else
    70         return query( p + 1, mid + 1, r, mid + 1 - l + ql - s, mid + 1 - l + qr - sum[p][qr], k - ss );
    71 }
    72 
    73 int main ()
    74 {
    75     int n, m;
    76     while ( scanf("%d%d", &n, &m) != EOF )
    77     {
    78         for ( int i = 1; i <= n; i++ )
    79         {
    80             scanf("%d", as + i);
    81             tree[0][i] = as[i];
    82         }
    83         sort( as + 1, as + 1 + n );
    84         build( 0, 1, n );
    85         while ( m-- )
    86         {
    87             int a, b, c;
    88             scanf("%d%d%d", &a, &b, &c);
    89             printf("%d
    ", query( 0, 1, n, a, b, c ));
    90         }
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    1725最少硬币问题(DP)
    3358高数Umaru系列(9)——哈士奇(DP)
    1018骨牌铺方格(分治算法)
    3664顺序表应用7:最大子段和之分治递归法(分治算法)
    1722整数因子分解问题(分治算法)
    剑指offer JZ-11
    剑指offer JZ-10
    剑指offer JZ-9
    剑指offer JZ-8
    剑指offer JZ-7
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4651569.html
Copyright © 2011-2022 走看看