pojStars(线段树)


1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N = 32000 + 10; 6 7 int ans[N << 2], sum[N << 2], x, y; 8 9 void PushUp(int rt) { 10 sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; 11 return; 12 } 13 14 void Build(int l, int r, int rt) { 15 //Tree[rt] ++; 16 if (l == r) { 17 sum[rt] = 0; 18 return; 19 } 20 int m = (l + r) >> 1; 21 Build(l, m, rt << 1); 22 Build(m + 1, r, rt << 1 | 1); 23 } 24 void Update(int p, int l, int r, int rt) { 25 //Tree[rt]--; 26 if (l == r) { 27 sum[rt]++; 28 return; 29 } 30 int m = (l + r) >> 1; 31 if (p <= m) Update(p, l, m, rt << 1); 32 else Update(p, m + 1, r, rt << 1 | 1); 33 PushUp(rt); 34 } 35 36 int Query(int L, int R, int l, int r, int rt) { 37 if (l >= L && r <= R) { 38 return sum[rt]; 39 } 40 int m = (l + r) >> 1; 41 int ANS = 0; 42 if (m >= L) ANS += Query(L, R, l, m, rt << 1); 43 if (m < R) ANS += Query(L, R, m + 1, r, rt << 1 | 1); 44 return ANS; 45 } 46 47 int main() { 48 49 int n; 50 scanf("%d", &n); 51 //Build(1, 32000, 1); 52 for (int i = 1; i <= n; i++) { 53 scanf("%d %d", &x, &y); 54 int t = Query(0, x, 0, 32000, 1); 55 //cout << t << "eee" << "\n"; 56 ans[t]++; 57 Update(x, 0, 32000, 1); 58 } 59 //Build(1, n, 1);a 60 /*for (int i = 1; i <= 7; i++) { 61 cout << sum[i] << "<" << "\n"; 62 }*/ 63 for (int i = 0; i < n; i++) { 64 printf("%d\n", ans[i]); 65 } 66 67 return 0; 68 }
永远热爱,永远向着光。

浙公网安备 33010602011771号