| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 31172 | Accepted: 13595 |
Description

Input
Output
Sample Input
5 1 1 5 1 7 1 3 3 5 5
Sample Output
1 2 1 1 0
Hint
树状数组:
//#define DEBUG
#include <stdio.h>
#define maxn 32002
int tree[maxn], level[maxn], n;
int lowBit(int x)
{
return x & (-x);
}
void update(int pos)
{
while(pos < maxn){
++tree[pos];
pos += lowBit(pos);
}
}
int getSum(int pos)
{
int sum = 0;
while(pos > 0){
sum += tree[pos];
pos -= lowBit(pos);
}
return sum;
}
int main()
{
#ifdef DEBUG
freopen("stdin.txt", "r", stdin);
freopen("stdout.txt", "w", stdout);
#endif
int x, y, i;
scanf("%d", &n);
for(i = 0; i < n; ++i){
scanf("%d%d", &x, &y);
++level[getSum(++x)];
update(x);
}
for(i = 0; i < n; ++i)
printf("%d\n", level[i]);
return 0;
}线段树:
#include <stdio.h>
#define maxn 32002
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
int tree[maxn << 2], level[maxn];
void pushUp(int rt)
{
tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];
}
void update(int pos, int l, int r, int rt)
{
if(l == r){
++tree[rt]; return;
}
int mid = (l + r) >> 1;
if(pos <= mid) update(pos, lson);
else update(pos, rson);
pushUp(rt);
}
int query(int left, int right, int l, int r, int rt)
{
if(l == left && r == right) return tree[rt];
int mid = (l + r) >> 1;
if(right <= mid) return query(left, right, lson);
else if(left > mid) return query(left, right, rson);
else return query(left, mid, lson) + query(mid + 1, right, rson);
}
int main()
{
int n, x, y, i;
scanf("%d", &n);
for(i = 0; i < n; ++i){
scanf("%d%d", &x, &y);
++level[query(0, x, 0, maxn - 1, 1)];
update(x, 0, maxn - 1, 1);
}
for(i = 0; i < n; ++i)
printf("%d\n", level[i]);
return 0;
}POJ2352 Stars 【树状数组】or【线段树】,布布扣,bubuko.com
原文:http://blog.csdn.net/chang_mu/article/details/37737211