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。但是存在两个区间完全重合,我的做法比较搓,就是判断和前一个区间是否完全相同,要是相同,就把前一个答案赋值给这个。
给你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]); } } }
相关文章推荐
- 全排列
- NSArray和NSMutableArray整理与总结
- rsync备份系统
- 七、堆排序
- jQuery的内容过滤选择器学习教程
- Caused by: android.view.InflateException: Binary XML file line #44: Error inflating class com.androi
- LeetCode--136. Single Number
- 面试中一些问题
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
- Assert.notNull(sessionUser);
- 绘图工具综合
- HDU 1016 Prime Ring Problem
- iOS开发~CocoaPods使用详细说明
- Java并发编程系列文章目录帖及源码
- hdu5045(状态压缩dp)
- java多线程核心技术梳理(附源码)
- 字体闪烁
- 3秒后自动跳转到另一个页面
- 【protected权限】java浅复制、深复制中,为什么在派生类中覆盖基类的clone()方法,并声明为public
- Qt 获取窗口的位置和大小