Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57285
  • 博文数量: 16
  • 博客积分: 306
  • 博客等级: 二等列兵
  • 技术积分: 162
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-20 15:08
文章分类

全部博文(16)

文章存档

2013年(1)

2012年(15)

我的朋友

分类: C/C++

2012-09-24 13:40:01

离线处理线段树

点击(此处)折叠或打开

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <cmath>
  7. #include <queue>
  8. #include <stack>
  9. #include <map>
  10. #include <set>
  11. using namespace std ;

  12. #pragma comment(linker, "/STACK:1024000000,1024000000")
  13. #define KEY_TREE ch[ ch[root][1] ][0]
  14. #define lson l , m , rt<<1
  15. #define rson m+1 , r , rt<<1|1
  16. #define lowbit(x) (x&(-x))
  17. #define pb push_back

  18. template<typename T> T Max( T a , T b ) { return a > b ? a : b ; }
  19. template<typename T> T Min( T a , T b ) { return a < b ? a : b ; }
  20. template<typename T> T Abs( T A ) { return A > 0 ? A : -1*A ; }
  21. template<typename T>void Swap( T &a , T &b) { T tmp = a ; a=b ; b = tmp ; }

  22. typedef pair<int , int> pii ;
  23. typedef long long llong ;

  24. const llong LINF = 0x3FFFFFFFFFFFFFFLL ;
  25. const int INF = 0X3FFFFFFF ;
  26. const int MAXN = 1e5+10 ;

  27. struct Node
  28. {
  29.     int l ;
  30.     int r ;
  31.     int h ;
  32.     int id ;
  33.     bool operator < (const Node &b) const
  34.     {
  35.         if ( h != b.h)
  36.             return h < b.h ;
  37.         if ( r != b.r )
  38.             return r < b.r ;
  39.         return l < b.r ;
  40.     }
  41. } nd[MAXN] ;

  42. struct Hei
  43. {
  44.     int h ;
  45.     int id ;
  46.     bool operator < (const Hei &b) const
  47.     {
  48.         if ( h != b.h )
  49.             return h < b.h ;
  50.         return id < b.id ;
  51.     }
  52. } H[MAXN] ;

  53. int res[MAXN] ;

  54. int cnt[MAXN<<2] ;
  55. void Build(int l , int r , int rt)
  56. {
  57.     cnt[rt] = 0 ;
  58.     if (l == r) return ;
  59.     int m = (l+r)>>1 ;
  60.     Build(lson) ;
  61.     Build(rson) ;
  62. }

  63. void Modify(int pos , int l , int r , int rt)
  64. {
  65.     if (l == r)
  66.     {
  67.         cnt[rt] = 1;
  68.         return ;
  69.     }
  70.     int m = (l+r)>>1 ;
  71.     if (pos <= m)
  72.         Modify( pos , lson);
  73.     else Modify(pos , rson);
  74.     cnt[rt]++ ;
  75. }

  76. int Query( int left , int right , int l , int r , int rt)
  77. {
  78.     if ( left <= l && r <= right )
  79.     {
  80.         return cnt[rt] ;
  81.     }
  82.     int m = (l+r)>>1;
  83.     int res = 0 ;
  84.     if (left <= m) res += Query(left , right , lson) ;
  85.     if (m < right) res += Query(left , right , rson) ;
  86.     return res ;
  87. }

  88. int main()
  89. {
  90.     int T;
  91.     scanf("%d", &T) ;
  92.     for ( int nca = 1 ; nca <= T; nca++ )
  93.     {
  94.         int n , m ;
  95.         scanf("%d%d", &n, &m) ;

  96.         for ( int i = 0 ; i < n ; i++ )
  97.             scanf("%d", &H[i].h) , H[i].id = i+1 ;
  98.         sort(H , H+n) ;

  99.         for ( int i = 0 ; i < m ; i++ )
  100.             scanf("%d%d%d", &nd[i].l , &nd[i].r , &nd[i].h) ,nd[i].l++ , nd[i].r++ , nd[i].id = i+1 ;
  101.         sort(nd , nd+m) ;

  102.         Build(1, n , 1) ;

  103.         int now_id = 0 ;
  104.         for ( int i = 0 ; i < m; i++ )
  105.         {
  106.             while ( H[now_id].h <= nd[i].h && now_id < n )
  107.                 Modify( H[now_id++].id , 1 , n , 1) ;

  108.             res[ nd[i].id ] = Query( nd[i].l , nd[i].r , 1 , n , 1) ;

  109.         }

  110.         printf("Case %d:\n", nca) ;
  111.         for ( int i = 1 ; i <= m; i++ )
  112.             printf("%d\n" , res[i]) ;

  113.     }
  114.     return 0 ;
  115. }

阅读(879) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~