POJ 2481 Cows
来源:互联网 发布:js 获取多个id 编辑:程序博客网 时间:2024/04/28 12:33
题目大意:
现有多个测例,每个测例中给出N段闭区间[si, ei](测例以N = 0结束,1 ≤ N ≤ 10^5),si和ei的范围为[1, 10^5],如果两区间[si, ei]和[sj, ej]满足si ≤ sj且ej ≤ ei且ei - si > ej - sj,则成前一个区间大于后一个区间,现要求对于每个测例,都按输入的顺序输出每个区间的比它大区间的数量。
题目链接
注释代码:
/* * Problem ID : POJ 2481 Cows * Author : Lirx.t.Una * Language : C * Run Time : 922 ms * Run Memory : 2480 KB */ #include <algorithm>#include <iostream>#include <cstring>#include <cstdio>//区间最大数量#defineMAXN100000using namespace std;structIntv {//interval,闭区间ints, e;//区间的左右端点intid;//区间的id,记录区间的输入顺序bool//对区间按照右端点从大到小排列,如果右端点相等则按照左端点从小到大排列operator<(const Intv &oth)const {if ( e == oth.e ) return s < oth.s;return e > oth.e;}};Intvinv[MAXN];//区间intans[MAXN];//按照输入顺序存放最终结果,每个区间大于它的区间数量//对inv排好序后,后一个区间的右端点一定小于等于前一个区间,而根据题目要求,只要找到之前左端点小于等于当前区间的区间数量即可,但是需要分情况讨论//考虑特殊情况,如果后以区间右端点等于前一区间的右端点,则需要找左端点小于当前区间左端点的区间数量 //但实际上,该如果当前区间左端点也等于前移区间左端点则其ans值和前移区间相同,对于其余情况就直接求左端点小于等于当前区间的数量即可intc[MAXN + 1];//对区间的s域建立树状数组intlowbit[MAXN + 1];intn;//区间数量voidupdate(int x) {while ( x <= n ) {//s域的最大值也是MAXNc[x]++;x += lowbit[x];}}intquery(int x) {intsum;sum = 0;while ( x > 0 ) {sum += c[x];x -= lowbit[x];}return sum;}intmain() {inti;for ( i = 1; i <= MAXN; i++ ) lowbit[i] = i & -i;while ( scanf("%d", &n), n ) {memset(c, 0, sizeof(c));for ( i = 0; i < n; i++ ) {inv[i].id = i;scanf("%d%d", &inv[i].s, &inv[i].e);inv[i].s++;//树状数组}sort(inv, inv + n);//先处理第一个区间ans[ inv[0].id ] = 0;update( inv[0].s );for ( i = 1; i < n; i++ ) {//剩下的分情况讨论if ( inv[i].e == inv[i - 1].e && inv[i].s == inv[i - 1].s )ans[ inv[i].id ] = ans[ inv[i - 1].id ];elseans[ inv[i].id ] = query( inv[i].s );update( inv[i].s );}printf("%d", *ans);for ( i = 1; i < n; i++ ) printf(" %d", ans[i]);putchar('\n');}return 0;}无注释代码:
#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#defineMAXN100000using namespace std;structIntv {ints, e;intid;booloperator<(const Intv &oth)const {if ( e == oth.e ) return s < oth.s;return e > oth.e;}};Intvinv[MAXN];intans[MAXN];intc[MAXN + 1];intlowbit[MAXN + 1];intn;voidupdate(int x) {while ( x <= n ) {c[x]++;x += lowbit[x];}}intquery(int x) {intsum;sum = 0;while ( x > 0 ) {sum += c[x];x -= lowbit[x];}return sum;}intmain() {inti;for ( i = 1; i <= MAXN; i++ ) lowbit[i] = i & -i;while ( scanf("%d", &n), n ) {memset(c, 0, sizeof(c));for ( i = 0; i < n; i++ ) {inv[i].id = i;scanf("%d%d", &inv[i].s, &inv[i].e);inv[i].s++;}sort(inv, inv + n);ans[ inv[0].id ] = 0;update( inv[0].s );for ( i = 1; i < n; i++ ) {if ( inv[i].e == inv[i - 1].e && inv[i].s == inv[i - 1].s )ans[ inv[i].id ] = ans[ inv[i - 1].id ];elseans[ inv[i].id ] = query( inv[i].s );update( inv[i].s );}printf("%d", *ans);for ( i = 1; i < n; i++ ) printf(" %d", ans[i]);putchar('\n');}return 0;}
0 0
- poj 2481 Cows
- poj 2481 Cows
- POJ 2481 cows
- Poj 2481 Cows
- poj 2481 cows
- POJ 2481 Cows
- poj 2481 Cows
- POJ 2481 Cows
- POJ 2481 Cows
- POJ 2481 Cows
- POJ 2481 Cows
- POJ:2481 Cows
- poj 2481 Cows
- POJ 2481 Cows
- POJ 2481 Cows
- poj 2481 Cows
- POJ 2481 Cows
- poj 2481 Cows
- hdu 1533 Going Home (KM算法)
- nginx 学习
- 进程间通信______信号
- 编程算法 - 单源最短路问题 Bellman-Ford 代码(C)
- atitit.编辑表单的实现最佳实践dwr jq easyui
- POJ 2481 Cows
- 用*号在屏幕上打印出sin函数图像
- String与StringBuilder的区别
- hdu 2767 强联通
- Windows 7下硬盘安装Ubuntu 13.04图文教程
- Android 适配器教程(二)
- HDU 1166
- 2014 BUPT 新生排位赛06
- web服务器实现