Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5640 Accepted Submission(s): 2235
5 1 1 5 1 7 1 3 3 5 5
1 2 1 1 0
#include <cstdio> #include <cstring> #include <algorithm> #define MAX 32000+1 using namespace std; int c[MAX<<2]; int rec[15000];//记录等级对应的星星数目 int lowbit(int x) { return x&(-x); } void update(int x) { while(x <= MAX) { c[x] += 1; x += lowbit(x); } } int sum(int x) { int s = 0; while(x > 0) { s += c[x]; x -= lowbit(x); } return s; } int main() { int n, i; int x, y; int level; while(~scanf("%d", &n)) { memset(c, 0, sizeof(c)); memset(rec, 0, sizeof(rec)); for(i = 0; i < n; i++) { scanf("%d%d", &x, &y); level = sum(x+1);//插入当前星星时记录其等级 也是数组所对应的下标 rec[level]++;// 自增一 update(x+1);//让坐标从1开始更新 } for(i = 0; i < n; i++) printf("%d\n", rec[i]); } return 0; }
#include <cstdio> #include <cstring> #include <algorithm> #define MAX 32000+1 using namespace std; int sum[MAX<<2]; int rec[15000];//记录等级对应的星星数目 void PushUp(int o) { sum[o] = sum[o<<1] + sum[o<<1|1]; } void build(int o, int l, int r) { sum[o] = 0; if(l == r) return ; int mid = (l+r) >> 1; build(o<<1, l, mid); build(o<<1|1, mid+1, r); PushUp(o); } void update(int o, int l, int r, int L) { if(l == r) { sum[o] += 1; return ; } int mid = (l+r) >> 1; if(L <= mid) update(o<<1, l, mid, L); else update(o<<1|1, mid+1, r, L); PushUp(o); } int query(int o, int l, int r, int L, int R) { if(L <= l && R >= r) { return sum[o]; } int mid = (l+r) >> 1; int res = 0; if(L <= mid) res += query(o<<1, l ,mid, L, R); if(R > mid) res += query(o<<1|1, mid+1, r, L, R); return res; } int main() { int n, x, y; int i, j; int level; while(~scanf("%d", &n)) { build(1, 1, MAX); memset(rec, 0, sizeof(rec)); for(i = 0; i < n; i++) { scanf("%d%d", &x, &y); level = query(1, 1, MAX, 1, x+1); rec[level]++; update(1, 1, MAX, x+1); } for(i = 0; i < n; i++) printf("%d\n", rec[i]); } return 0; }