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; }