POJ-2481 Cows 树状数组
2018-02-06 15:55
375 查看
参考:http://blog.jobbole.com/96430/
// Cows // http://poj.org/problem?id=2481 #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100000 + 10; int maxe = -1; struct Segment { int s, e, id; bool operator < (const Segment& r) const { if (s < r.s) return true; if (s > r.s) return false; return e > r.e; } }; int N; int arr[maxn]; Segment seg[maxn]; int ans[maxn]; inline int lowbit(int x) { return x & -x; } void add(int *arr, int x, int v) { for (int i = x; i <= maxe; i+=lowbit(i)) { arr[i] += v; } } int sum(int* arr, int x) { int s = 0; for (int i = x; i ; i-=lowbit(i)) { s += arr[i]; } return s; } int main() { while (cin >> N) { if (!N) break; maxe = -1; for (int i = 1; i <= N; i++) { scanf("%d%d", &seg[i].s, &seg[i].e); seg[i].id = i; maxe = max(maxe, seg[i].e); } memset(arr, 0, (maxe+4)*sizeof(int)); sort(seg+1, seg+1+N); int lasti = 1; add(arr, seg[1].e, 1); ans[seg[1].id] = 0; for (int i = 2; i <= N; i++) { if (seg[i].s == seg[lasti].s && seg[i].e == seg[lasti].e) { ans[seg[i].id] = sum(arr, maxe) - sum(arr, seg[i].e - 1) - 1; continue; } else { if (i-1 > lasti) { add(arr, seg[lasti].e, i-1-lasti); } } ans[seg[i].id] = sum(arr, maxe) - sum(arr, seg[i].e - 1); add(arr, seg[i].e, 1); lasti = i; } for (int i = 1; i <= N; i++) { printf("%d ", ans[i]); } printf("\n"); } return 0; }
相关文章推荐
- POJ 2481 Cows 【树状数组】
- POJ 2481 Cows (树状数组)
- poj 2481 Cows (树状数组)
- poj 2481 - Cows(树状数组)
- POJ 2481 Cows(树状数组)
- POJ 2481 Cows(树状数组)
- POJ 2481 Cows【树状数组】
- poj 2481 Cows 树状数组
- poj 2481 Cows (树状数组)
- poj 2481 Cows(树状数组)
- POJ 2481 Cows(树状数组)
- POJ - 2481 Cows(树状数组)
- POJ 2481 Cows (树状数组)
- POJ 2481 Cows【树状数组 变相求逆序对】
- POJ 2481 Cows (树状数组)
- POJ 2481 Cows (树状数组)
- poj2481 Cows(树状数组)
- POJ - 2481 Cows解题报告(树状数组 相同点重复计数处理)
- poj 2481 Cows(树状数组)
- POJ 2481 Cows(树状数组)