POJ 2481 - Cows 树状数组
树状数组
作用
O(logN)的复杂度计算数组A[]从1到N项和。
优点
在线数据结构,复杂度低。
复杂度
修改A[N] -> O(logN)
计算∑A[1..N] -> O(logN)
模板
struct BIT{ //Binary Indexed Tree
int Tree[MAXS + 10], size;
#define lowbit(i) (i&(-i))
BIT(){}
BIT(int SIZE): size(SIZE){
memset(Tree + 1, 0, SIZE * sizeof(int));
}
void add(int i, int det){
for (; i <= size; i += lowbit(i))
Tree[i] += det;
}
int sum(int i){
int res = 0;
for (; i > 0; i -= lowbit(i))
res += Tree[i];
return res;
}
#undef lowbit
};
辛酸的血泪史

//POJ 2481
//树状数组
//把10^5当成10000调了一个下午加半个晚上
//再见世界
//AC 2016-10-16
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#define MAXN 100000
#define MAXS 100000
using namespace std;
struct cow{
int s, e, tag;
friend bool operator < (const cow &c1, const cow &c2){
return (c1.e > c2.e) || (c1.e == c2.e) && (c1.s < c2.s);
}
}cows[MAXN + 10];
struct BIT{
int Tree[MAXS + 10], size;
void resize(int SIZE){
size = SIZE;
memset(Tree + 1, 0, SIZE * sizeof(int));
}
inline int lowbit(int x){
return x&-x;
}
void inc(int i){
for (; i <= size; i += lowbit(i))
Tree[i]++;
}
int sum(int i){
int res = 0;
for (; i > 0; i -= lowbit(i))
res += Tree[i];
return res;
}
}stronger;
int ans[MAXN + 10];
int main(){
int n;
freopen("fin.c", "r", stdin);
while (scanf("%d", &n), n){
int top = 0;
for (int i = 1; i <= n; i++){
scanf("%d%d", &cows[i].s, &cows[i].e);
cows[i].s++, cows[i].e++;
cows[i].tag = i;
if (top < cows[i].s) top = cows[i].s;
}
stronger.resize(top);
sort(cows + 1, cows + n + 1);
for (int i = 1; i <= n; i++){
if ((i - 1)&&(cows[i].e == cows[i - 1].e)&&(cows[i].s == cows[i - 1].s))
ans[cows[i].tag] = ans[cows[i - 1].tag];
else
ans[cows[i].tag] = stronger.sum(cows[i].s);
stronger.inc(cows[i].s);
}
printf("%d", ans[1]);
for (int i = 2; i <= n; i++)
printf(" %d", ans[i]);
puts("");
}
return 0;
}
浙公网安备 33010602011771号