您的位置:首页 > 其它

poj 2481 树状数组

2016-08-23 15:46 211 查看
poj 2481 树状数组
题目大意:有n个cow,每一个都有自己的区间,如果a是b的真子集,则说b比a强。

问每个cow比多少个cow弱。

分析:

       即求一个区间是多少个区间的真子集。把cow按s的升序排列,若相等则按e的降序排列,

然后依次加入树状数组,加入前记录e大于当前e【i】的cow数量。然后按顺序输出即可。可用结构体记录cow的相关参数。

注意:Huge input and output,scanf and printf is recommended.

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100005
#define lowbit(x) (x&-x)
using namespace std;
int c
,ans
;
struct Node
{
int s,e,pos;
}cow
;
void add(int k,int d){
while(k<=N){
c[k]+=d;
k+=lowbit(k);
}
}
int sum(int k){
int res=0;
while(k){
res+=c[k];
k-=lowbit(k);
}
return res;
}
bool cam(Node a,Node b){
if(a.s==b.s)return a.e>b.e;
return a.s<b.s;
}
int main() {
int n;
while(EOF!=scanf("%d",&n),n){
for (int i = 1; i <= n; ++i)
{
scanf("%d%d",&cow[i].s,&cow[i].e);
cow[i].s++;cow[i].e++;
cow[i].pos=i;
}
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
sort(cow+1,cow+1+n,cam);
for (int i = 1; i <= n; ++i)
{
if(cow[i].s==cow[i-1].s && cow[i].e==cow[i-1].e)
ans[cow[i].pos]=ans[cow[i-1].pos];
else
ans[cow[i].pos]=sum(N)-sum(cow[i].e-1);
add(cow[i].e,1);
}
for (int i = 1; i < n; ++i)printf("%d ", ans[i]);
printf("%d\n", ans
);
}
return 0;
}
/*测试数据
5
3 4
3 5
3 6
2 4
1 5
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: