ZOJ1989 POJ1634 Who's the Boss
2012-06-11 21:33
441 查看
可以暴力过,但是起码要好几百ms
这里我设置了上帝哨兵,同时使用迭代搜索。
先按工资排序。然后对于x,如果x的前一个人x-1的身高不低于x,则x-1就是x的上司(boss[x]=x-1);否则,我们就要测试x-1的上司boss[x-1]是否x的上司,一直迭代到上帝哨兵(上帝哨兵肯定是所有人的上司)。
这里我设置了上帝哨兵,同时使用迭代搜索。
先按工资排序。然后对于x,如果x的前一个人x-1的身高不低于x,则x-1就是x的上司(boss[x]=x-1);否则,我们就要测试x-1的上司boss[x-1]是否x的上司,一直迭代到上帝哨兵(上帝哨兵肯定是所有人的上司)。
/******************************************************************************* # Author : Neo Fung # Email : neosfung@gmail.com # Last modified: 2012-06-11 21:30 # Filename: ZOJ1989 POJ1634 Who's the Boss.cpp # Description : ******************************************************************************/ #ifdef _MSC_VER // #define DEBUG #define _CRT_SECURE_NO_DEPRECATE #endif #include <fstream> #include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <limits.h> #include <algorithm> #include <math.h> #include <numeric> #include <functional> #include <ctype.h> using namespace std; const int kMAX=30010; const double kEPS=10E-6; struct NODE { int id,salary,height; bool operator<(const NODE &t) const { return salary>t.salary; } }nodes[kMAX]; int map[1000000],subordinates[kMAX],boss[kMAX]; int inline FindBoss(const int &y,const int &x) { if(!x) return 0; if(nodes[y].height>=nodes[x].height) // 如果y是x的上司 return y; else return FindBoss(boss[y],x); // 否则测试y的上司是x的上司 } int main(void) { #ifdef DEBUG freopen("../stdin.txt","r",stdin); freopen("../stdout.txt","w",stdout); #endif int n,m,ncase=1,tmp; scanf("%d",&ncase); nodes[0].id=0; nodes[0].salary=nodes[0].height=(1<<30); // 上帝哨兵 while(ncase--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d%d%d",&nodes[i].id,&nodes[i].salary,&nodes[i].height); sort(nodes+1,nodes+1+n); for(int i=0;i<=n;++i) map[nodes[i].id]=i; memset(subordinates,0,sizeof(subordinates)); boss[0]=0; for(int i=1;i<=n;++i) boss[i]=FindBoss(i-1,i); for(int i=n;i>=1;--i) subordinates[boss[i]]+=(1+subordinates[i]); while(m--) { scanf("%d",&tmp); int x=nodes[boss[map[tmp]]].id; printf("%d %d\n",x,subordinates[map[tmp]]); } } return 0; }
相关文章推荐
- POJ 1634 Who's the boss?
- pku 1634 Who's the boss? stl排序+二分查找
- poj 2388 Who's in the Middle
- poj 2388 Who's in the Middle
- poj 2388 Who's in the Middle
- POJ 2388 Who's in the Middle
- Poj 2388 Who's in the Middle
- poj 2388 Who's in the Middle
- POJ--2388 Who's in the Middle (续)
- Who's in the Middle - POJ 2388 水题
- POJ 2388 && HDU 1157 Who's in the Middle(水~)
- poj 1634 Who's the boss?
- POJ_2388 Who's in the Middle
- POJ 2388 Who's in the Middle
- POJ 2388-Who's in the Middle
- poj 2388 Who's in the Middle
- POJ--2388 Who's in the Middle
- POJ - 2388 Who's in the Middle
- poj-2388 Who's in the Middle
- poj-2388-Who's in the Middle