AC_Dream 1216 G - Beautiful People
2014-10-03 10:39
211 查看
题意:
有n个人每人有一个力气值Si,美丽值Bi,满足Bi>Bj&&Si>Sj 或者 Bi<Bj&&Si<Sj 的人可以
一起参见晚会,问最多有多少人可以一起参见晚会。
思路: 我们根据S从小到大将所有人排序,然后看B最长的上升子序列的长度求出来即可!
在排序中优先对S排序,S相等的则对B进行由大到小的排序,why?
也就是对于S相同的,我们先选取B最大的值插入LIS中,因为比如 S1=1, B1 = 1
S1=1, B1 = 2, S1=1, B1 = 3, 如果不进行排序,直接按照求B中的lis,显然长度
为3,显然是不对的,因为相同的S中只能选择一个B出来!所以就要对S相同的B进行
降序排序! 这样就变成了一个裸lis!
View Code
有n个人每人有一个力气值Si,美丽值Bi,满足Bi>Bj&&Si>Sj 或者 Bi<Bj&&Si<Sj 的人可以
一起参见晚会,问最多有多少人可以一起参见晚会。
思路: 我们根据S从小到大将所有人排序,然后看B最长的上升子序列的长度求出来即可!
在排序中优先对S排序,S相等的则对B进行由大到小的排序,why?
也就是对于S相同的,我们先选取B最大的值插入LIS中,因为比如 S1=1, B1 = 1
S1=1, B1 = 2, S1=1, B1 = 3, 如果不进行排序,直接按照求B中的lis,显然长度
为3,显然是不对的,因为相同的S中只能选择一个B出来!所以就要对S相同的B进行
降序排序! 这样就变成了一个裸lis!
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<cstdio> #define N 100005 using namespace std; struct node{ int x, y; int p; }; bool cmp(node a, node b){ if(a.x == b.x) return a.y > b.y; return a.x < b.x; } bool myCmp(node a, node b){ return a.y <= b.y;//这里要写成 <=;因为upper_bound返回的是“元素值 >插入值” //最后一个插入值的位置,元素值 == 插入值的时候,默认 元素值 // >插入值,但在该题中,相等的情况下不能算在lis中的! } node a ; node c ; int pre , path ; int main(){ int n; while(scanf("%d", &n) != EOF){ for(int i=0; i<n; ++i) scanf("%d%d", &a[i].x, &a[i].y), a[i].p = i+1; sort(a, a+n, cmp); c[0] = a[0]; pre[0] = 0; path[0] = 0; int len = 1; for(int i=1; i<n; ++i){ int k = upper_bound(c, c+len, a[i], myCmp) - c; pre[i] = k ? path[k-1] : 0;//当前插入节点i的位置为k,它的前一个(k-1位置)元素的序号! path[k] = i;//当前插入k位置的节点的序号 c[k] = a[i]; if(k+1 > len) len = k+1; } int tmp = path[len-1]; printf("%d\n", len); printf("%d", a[path[len-1]].p); for(int i=len-2; i >= 0; --i){ tmp = pre[tmp]; printf(" %d", a[tmp].p); } printf("\n"); } return 0; }
View Code
相关文章推荐
- ACdream 1216Beautiful People(二重最长上升子序列)
- ACdream 1216 Beautiful People 二路最长上升子序列
- ACdream 1015 Double Kings【贪心*2】
- ACdream 完美数 数位DP
- ACdream oj C - 神奇的%系列一 (水题系列--略坑)
- Acdreamoj1115(数学思维题)
- ACdreamoj(1105)模拟题
- ACdreamoj 1011(树状数组维护字符串hash前缀和)
- acdream 1220 哈夫曼树
- ACdream 1427 Nice Sequence
- ACdream 1057 Vision Field 线段树+二分查找
- ACdream1072——Kill The Monster
- ACdream 1063 平衡树
- acdream 1682 吃不完的糖果(环形最大子段和)
- ACdream: ACfun
- ACdream 1414(计算几何)
- ACdream 1139(Sum-逆元)
- ACdreamoj1110(多重背包)
- AC_Dream 1224 Robbers(贪心)
- ACdream 1431 Sum vs Product