您的位置:首页 > 其它

poj 2352 Stars 树状数组

2017-03-24 20:28 330 查看

题目链接:

http://poj.org/problem?id=2352

题意:

给你一系列点(按y递增,x递增排列),level[X] 指的是 在当前点的左下方 包括自己 的点数为X 的这些点的个数。

题解:

树状数组

y递增,不管y,只要维护x就行了

读入一个点,找到比他小的点的个数,也就是他的等级,然后将这个等级的点的个数加一即可

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
#define MS(a) memset(a,0,sizeof(a))
#define MP make_pair
#define PB push_back
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
//////////////////////////////////////////////////////////////////////////
const int maxn = 32000+10;

int bit[maxn],level[maxn];

void add(int x,int v){
while(x < maxn){
bit[x] += v;
x += x&-x;
}
}

int sum(int x){
int res = 0;
while(x > 0){
res += bit[x];
x -= x&-x;
}
return res;
}

int main(){
int n=read();
MS(level); int x,y;
for(int i=0; i<n; i++){
x=read(),y=read(); x++;
add(x,1);
level[sum(x)]++;
}

for(int i=1; i<=n; i++)
cout << level[i] << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: