zoukankan      html  css  js  c++  java
  • hdu--2852--树状数组

    擦 这题 绝逼 坑人 + 一波N折。。。。

        touch  me

    我一开始 用了最简单 最sb的 一维hash数组 来做 我看时间2000ms最大数才10W 还以为能过的 ...果断tle了

    然后 就觉得应该用更高效的数据结构来做了

    我去问下了下porker 他一开始和我提了下  splay 不会啊=-=

    然后 说 树状数组 + 查询的时候 用二分 也可以做到

    我就去往 这个方向去想了--------TM的被自己思维定势了... tree[x]把它固定成X有几个了... 然后就一直没做出来

    后来 参考了传送

    最TM坑的是 我用cin cout一直TLE明明已经写了cin.sync..............

    然后改成scanf printf 看A了之后 再改回来 再交 又TLE了

    卧槽...

      1 #include <iostream>
      2 #include <cstring>
      3 using namespace std;
      4 
      5 const int size = 100010;
      6 int tree[size];//  tree[x] 即 小于等于x的数有几个
      7 
      8 int lowbit( int x )
      9 {
     10     return x & -x;
     11 }
     12 
     13 void update( int x , int var )
     14 {
     15     while( x<size )
     16     {
     17         tree[x] += var;
     18         x += lowbit(x);
     19     }
     20 }
     21 
     22 int getNum( int x )
     23 {
     24     int cnt = 0;
     25     while( x )
     26     {
     27         cnt += tree[x];
     28         x -= lowbit(x);
     29     }
     30     return cnt;
     31 }
     32 
     33 int find( int x , int k )
     34 {
     35     int l = x+1 , r = size-5 , ans = size , mid;
     36     int temp = getNum(x);
     37     int val;
     38     while( l<r )
     39     {
     40         mid = l + (r-l)/2;
     41         val = getNum(mid) - temp;
     42         if( val<k )
     43         {
     44             l = mid+1;
     45         }
     46         else
     47         {
     48             r = mid;
     49             if( ans > mid )
     50                 ans = mid;
     51         }
     52     }
     53     return ans;
     54 }
     55 
     56 int main()
     57 {
     58     cin.sync_with_stdio(false);
     59     int n , num , m ,ans , k;
     60     while( cin >> n )
     61     {
     62         memset( tree , 0 , sizeof(tree) );
     63         while( n-- )
     64         {
     65             //scanf("%d",&m);
     66             cin >> m;
     67             if( !m )
     68             {
     69                 //scanf("%d",&num);
     70                 cin >> num;
     71                 update( num , 1 );
     72             }
     73             else if( m==1 )
     74             {
     75                 //scanf("%d",&num);
     76                 cin >> num;
     77                 if( getNum(num) - getNum(num-1) == 0 )
     78                 {
     79                     //printf("No Elment!
    ");
     80                     cout << "No Elment!" << endl;
     81                 }
     82                 else
     83                 {
     84                     update( num , -1 );
     85                 }
     86             }
     87             else
     88             {
     89                 //scanf("%d %d",&num,&k);
     90                 cin >> num >> k;
     91                 ans = find( num , k );
     92                 if( ans == size )
     93                     //printf("Not Find!
    ");
     94                     cout << "Not Find!" << endl;
     95                 else
     96                     //printf("%d
    ",ans);
     97                     cout << ans << endl; 
     98             }
     99         }
    100     }
    101     return 0;
    102 }
    View Code
     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 const int size = 100010;
     6 int hash[size];
     7 
     8 int main()
     9 {
    10     cin.sync_with_stdio(false);
    11     int m , k , num , maxNum , cnt , choice;
    12     bool flag;
    13     while( cin >> m )
    14     {
    15         maxNum = 0;
    16         memset( hash , 0 , sizeof(hash) );
    17         while( m-- )
    18         {
    19             cin >> choice;
    20             if( !choice )
    21             {
    22                 cin >> num;
    23                 hash[num] ++;
    24                 if( maxNum < num )
    25                     maxNum = num;
    26             }
    27             else if( choice == 1 )
    28             {
    29                 cin >> num;
    30                 if( hash[num] )
    31                 {
    32                     hash[num] --;
    33                 }
    34                 else
    35                 {
    36                     cout << "No Elment!" << endl;
    37                 }
    38             }
    39             else
    40             {
    41                 flag = false;
    42                 cnt = 0;
    43                 cin >> num >> k;
    44                 for( int i = num+1 ; i<=maxNum ; i++ )
    45                 {
    46                     if( hash[i] )
    47                     {
    48                         cnt += hash[i];
    49                         if( cnt>=k )
    50                         {
    51                             cout << i << endl;
    52                             flag = true;
    53                             break;
    54                         }
    55                     }
    56                 }
    57                 if( !flag )
    58                     cout << "Not Find!" << endl;
    59             }
    60         }
    61     }
    62     return 0;
    63 }
    View Code
    just follow your heart
  • 相关阅读:
    bzoj1711: [Usaco2007 Open]Dining吃饭
    bzoj1036: [ZJOI2008]树的统计Count
    bzoj1497: [NOI2006]最大获利
    bzoj2561: 最小生成树
    BZOJ 2083: [Poi2010]Intelligence test( )
    BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )
    BZOJ 1110: [POI2007]砝码Odw( 贪心 )
    BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )
    BZOJ 1537: [POI2005]Aut- The Bus(dp + BIT)
    BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )
  • 原文地址:https://www.cnblogs.com/radical/p/3901531.html
Copyright © 2011-2022 走看看