您的位置:首页 > 编程语言 > C语言/C++

poj 2481 Cows

2017-04-15 16:26 232 查看
Cows

题目链接:点击打开链接

解题思路:先将题目抽象化为一维坐标上的线段真包含关系,实例中0 3完全包括1 2,只有这一组成立的关系,所以答案为1 0 0 。

将1 2,0 3,3 4.当做二维坐标来看放到二维坐标系中来看,转化成求一个点的左上方有多少点,类似于poj 2352;

所以解题思路就欧了;

代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define MAXN 100005
using namespace std;
int tree[MAXN];
int n;
int ans[MAXN];
struct Node{
int s,e,id;
};

int cmp(Node a,Node b)
{
if(a.e!=b.e)
return a.e>b.e;
else
return a.s<b.s;
}
void add(int x)
{
for(int i=x;i<=n;i+=i&-i)
tree[i]+=1;
}
int read(int x)
{
int sum=0;
for(int i=x;i>0;i-=i&-i)
sum+=tree[i];
return sum;
}
int main()
{
Node in[MAXN];
while(scanf("%d",&n),n)
{
memset(tree,0,sizeof(tree));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
{
scanf("%d%d",&in[i].s,&in[i].e);
in[i].id=i;
in[i].s++;in[i].e++; //做多了就知道0是死循环的陷阱
}
sort(in+1,in+n+1,cmp);
for(int i=1;i<=n;i++)
{
int num;
if(in[i].s==in[i-1].s && in[i].e==in[i-1].e) //区间相同时,比他强壮的牛的数量也相同
num=ans[in[i-1].id];
else
num=read(in[i].s);
add(in[i].s);
ans[in[i].id]=num;//后来加入的坐标y坐标越来越小,不会影响前面的统计,直接赋值不用++;
}
for(int i = 1 ; i <= n ; ++i)
{
printf("%d ",ans[i]) ;
}
printf("\n") ;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息