poj 2352 Stars (线段树做法)
2011-08-02 16:25
507 查看
以前拿树状数组做过,貌似很简单,今天头很疼,昨晚没睡好,实在不想想其他难题了,就拿这个用线段树练练手。
因为y是有序的,所以直接求出小于x的有多少个即可。
因为y是有序的,所以直接求出小于x的有多少个即可。
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MID(x,y) ( ( x + y ) >> 1 ) #define L(x) ( x << 1 ) #define R(x) ( x << 1 | 1 ) #define BUG puts("here!!!") using namespace std; const int MAX = 32010; struct Tnode{ int l,r,val;}; Tnode node[MAX<<2]; int a[15005],lev[15005]; void init() { memset(node,0,sizeof(node)); memset(lev,0,sizeof(lev)); } void Build(int t,int l,int r) { node[t].l = l; node[t].r = r; node[t].val = 0; if( node[t].l == node[t].r - 1 ) return ; int mid = MID(l,r); Build(L(t),l,mid); Build(R(t),mid,r); } void Updata(int t,int l,int r) { if( node[t].l >= l && node[t].r <= r ) { node[t].val++; return ; } if( node[t].l == node[t].r - 1 ) return ; int mid = MID(node[t].l,node[t].r); if( l <= mid ) Updata(L(t),l,r); if( r > mid ) Updata(R(t),l,r); node[t].val = node[R(t)].val + node[L(t)].val; } int Query(int t,int l,int r) { if( node[t].l >= l && node[t].r <= r ) return node[t].val; int ans = 0; int mid = MID(node[t].l,node[t].r); if( l <= mid ) ans += Query(L(t),l,r); if( r > mid ) ans += Query(R(t),l,r); return ans; } int main() { int n,y; while( ~scanf("%d",&n) ) { init(); int mmax = 0; for(int i=0; i<n; i++) { scanf("%d%d",&a[i],&y); mmax = max(mmax,a[i]); } Build(1,0,mmax+1); for(int i=0; i<n; i++) { int ans = Query(1,0,a[i]+1); lev[ans]++; Updata(1,a[i],a[i]+1); } for(int i=0; i<n; i++) printf("%d\n",lev[i]); } return 0; }
相关文章推荐
- POJ 2352 Stars 线段树
- POJ 2352 Stars 线段树
- poj 2352 Stars(线段树)
- poj 2352 Stars 用线段树实现 (有点水)
- poj 2352 Stars(线段树||树状数组)
- POJ 2352_Stars && POJ-2481 Cows (线段树单点更新+树状数组)
- POJ-2352 Stars 线段树
- POJ 2352 Stars Treap & 线段树
- POJ 2352 Stars(线段树单点更新)
- poj 2352 stars_线段树基础
- POJ 2352 Stars(线段树)
- POJ 2352 Stars 线段树
- POJ 2352-Stars(线段树)
- poj 2352 Stars(线段树)
- POJ 2352 Stars(树状数组 or 线段树)
- poj_2352 Stars ( 线段树)
- POJ 2352 Stars 线段树 pascal
- POJ 2352 Stars - 树状数组/线段树
- POJ 2352 Stars (线段树)
- POJ 2352 Stars (线段树)