您的位置:首页 > 其它

POJ 2481 Cows (数组数组求逆序对)

2016-04-18 15:50 357 查看
题目链接:http://poj.org/problem?id=2481

给你n个区间,让你求每个区间被真包含的区间个数有多少,注意是真包含,所以要是两个区间的x y都相同就算0。(类似poj3067,cf652D)

对每个区间的x从小到大排序,相同的话按y从大到小排序。然后对枚举每个区间的y求其逆序对,然后在y的位置上置1。但是存在两个区间完全重合,我的做法比较搓,就是判断和前一个区间是否完全相同,要是相同,就把前一个答案赋值给这个。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1e5 + 5;
typedef long long LL;
int bit[MAXN] , m , ans[MAXN];
struct data {
int x , y , id;
bool operator <(const data &cmp) const {
if(x == cmp.x)
return y > cmp.y;
return x < cmp.x;
}
}a[MAXN];

inline void add(int i) {
for( ; i <= m ; i += (i & -i))
bit[i]++;
}

int sum(int i) {
int s = 0;
for( ; i >= 1 ; i -= (i & -i))
s += bit[i];
return s;
}

int main()
{
int n;
while(~scanf("%d" , &n) && n) {
memset(bit , 0 , sizeof(bit));
m = 0;
for(int i = 0 ; i < n ; i++) {
scanf("%d %d" , &a[i].x , &a[i].y);
a[i].id = i;
a[i].x++ , a[i].y++;
m = max(m , a[i].y);
}
sort(a , a + n);
for(int i = 0 ; i < n ; i++) {
if(i > 0 && a[i].x == a[i - 1].x && a[i].y == a[i - 1].y) {
ans[a[i].id] = ans[a[i - 1].id];                //判断相同并赋值
}
else {
ans[a[i].id] = i - sum(a[i].y - 1);
}
add(a[i].y);
}
for(int i = 0 ; i < n ; i++) {
if(i != n - 1)
printf("%d " , ans[i]);
else
printf("%d\n" , ans[i]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: