最长上升子序列O(n log n):http://www.cnblogs.com/hehe54321/p/cf-340d.html

题目:https://cn.vjudge.net/problem/ZOJ-2319

https://cn.vjudge.net/problem/SGU-199

题意:给出一种数据,它有两个属性s和b。现在有它的两个实例x和y。定义如果 x.s<y.s&&x.b<y.b 或者 x.s>y.s&&x.b>y.b 那么x与y不相冲突,否则x与y冲突。在给出的n个数据中选出最多的数据,使得其中任意两个数据不相冲突。

思路:

直觉给出的思路是按照s、b分别为第一、二关键字将原数据排序,然后O(n log n)求最长上升子序列。但是实际写了之后会发现这么做有问题,因为如果第一个数据的s大于第二个数据的s,第一个的b小于第二个的b,那么取第一个数据还是第二个数据不好是不一定的。或者说,这种数据如果a不大于b那么a也不一定小于等于b。(反正就是不行...)

正确做法就是稍微变一下,先按照s为关键字排序,然后按照b为关键字求最长上升子序列。当然,这里的最长上升子序列要求s也是严格小于,而不只是b严格小于,因此多了一些细节需要处理。这里用的方法类似这个,就是一些小技巧 http://blog.csdn.net/scnu_jiechao/article/details/40670393

 #include<cstdio>
#include<algorithm>
using namespace std;
struct P
{
int a1,a2,num;
bool operator<(const P& b) const
{
return a1<b.a1||(a1==b.a1&&a2>b.a2);
}
};
bool cmp(const P& a,const P& b)
{
return a.a2<b.a2;
}
P a[],s[];
int f[],len,n,t;
int main()
{
int i,j;
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d%d",&a[i].a1,&a[i].a2),a[i].num=i;
sort(a+,a+n+);
for(i=;i<=n;i++)
{
t=lower_bound(s+,s+len+,a[i],cmp)-s;
s[t]=a[i];
f[i]=t;
len=max(len,t);
}
printf("%d\n",len);
for(i=n,j=len;i>=;i--)
if(f[i]==j)
{
printf("%d ",a[i].num);
j--;
}
return ;
}

Beautiful People SGU - 199 ZOJ - 2319的更多相关文章

  1. [SGU 199] Beautiful People

    [SGU 199] Beautiful People The most prestigious sports club in one city has exactly N members. Each ...

  2. I - Beautiful People ZOJ - 2319 (二分法)

    The most prestigious sports club in one city has exactly N members. Each of its members is strong an ...

  3. SGU 199 Beautiful People(DP+二分)

    时间限制:0.25s 空间限制:4M 题意: 有n个人,每个人有两个能力值,只有一个人的两个能力都小于另一个的能力值,这两个人才能共存,求能同时共存的最大人数. Solution: 显然这是一个两个关 ...

  4. SGU 199 - Beautiful People 最长上升子序列LIS

    要邀请n个人参加party,每个人有力量值strength Si和魅力值 beauty Bi,如果存在两人S i ≤ S j and B i ≥ B j 或者  S i ≥ S j and B i ≤ ...

  5. ZOJ 2319 Beautiful People

    LIS.先按S降序升序再按B降序排序(如果B不按降序排序的话就会覆盖掉正解),然后再对B用O(nlog(n))的LIS求解就可以了.用d数组标记每个元素在上升序列中的位置,然后根据d倒着找id就可以了 ...

  6. SGU 199 Beautiful People 二维最长递增子序列

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20885 题意: 求二维最长严格递增子序列. 题解: O(n^2) ...

  7. ZOJ 2319 Beatuiful People(单调递增序列的变形)

    Beautiful People Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special Judge The most prest ...

  8. ASC #1

    开始套题训练,第一套ASC题目,记住不放过每一题,多独立思考. Problem A ZOJ 2313 Chinese Girls' Amusement 循环节 题意:给定n,为圆环长度,求k < ...

  9. zoj Beautiful Number(打表)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2829 题目描述: Mike is very lucky, as ...

随机推荐

  1. android5.0(Lollipop) BLE Peripheral牛刀小试

    转载请表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46468743 知道Android L对蓝牙对了一些改进.包含加入A2dp s ...

  2. hihocode #1388 : Periodic Signal NTT

    #1388 : Periodic Signal   描述 Profess X is an expert in signal processing. He has a device which can ...

  3. All the best open source and Software as a Service (SaaS) tools in one place 工具 工欲善其事必先利其器

    Open Source & SaaS Tools | StackShare https://stackshare.io/categories AfterShip/SaaS: List of S ...

  4. LCS的几种求法

    \(LCS:\) 对于两个长度均为 \(N\) 的数列 \(A\) 和 \(B\) ,存在一个数列 \(C\) 使得 \(C\) 既是 \(A\) 的子序列有事 \(B\) 的子序列,现在需要求这个数 ...

  5. aop+自定义注解

    自定义注解,并且实现,需要两个文件: 自定义注解类: package com.clc.server.annotation; import java.lang.annotation.ElementTyp ...

  6. Hadoop 文件压缩

    一.目的 a. 减小磁盘占用 b. 加速网络IO 二.几个常用压缩算法 是否可切分:是指压缩后的文件能否支持在任意位置往后读取数据. 各种压缩格式特点: 压缩算法都需要权衡 空间/时间 :压缩率越高, ...

  7. Hadoop一些要注意的点

    1.大多小文件的劣处: a. 生成更多的map任务,额外的开销: b. 每个文件都需要守址时间: c. HDFS上namenode需要占用内存空间:

  8. bootstrap的学习注意点

    1.bootstrop里面所有的内容都需要用一个container 容器包裹起来: 2.一屏二屏什么的,是通过id 与href实现的: 3.下拉与菜单之类的都有固定的代码: 4.需要修改相关属性的话, ...

  9. poj 1195 Mobile phones 解题报告

    题目链接:http://poj.org/problem?id=1195 题目意思:有一部 mobie phone 基站,它的面积被分成一个个小正方形(1 * 1 的大小),所有的小正方形的面积构成了一 ...

  10. silverlight中 ComboBox绑定数据库,并获取当前选定值

    silverlight中 ComboBox绑定数据库,并获取当前选定值 在silverlight中 用combobox下拉菜单绑定数据库的方法和用DataGrid绑定数据库的方法类似. page.xa ...