最长上升子序列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. mysql创建 存储过程 并通过java程序调用该存储过程

    create table users_ning(id primary key auto_increment,pwd int); insert into users_ning values(id,123 ...

  2. SQL常见问题及解决备忘

    1.mysql中:you cant't specify tartget table for update in from clause 错误 含义:在同一语句中update或delete某张表的时候, ...

  3. Scaling with Microservices and Vertical Decomposition

    Scaling with Microservices and Vertical Decomposition – dev.otto.de https://dev.otto.de/2014/07/29/s ...

  4. JSON和JavaScript对象

    var obj={width:100,height:200},这样的并不叫JSON,并且JSON只是一种数据格式,并不是具体的实例. 但很多人把这样的JS对象当成JSON,下面把这个问题讲清楚 一.J ...

  5. ZeroMQ 初步认识

    http://www.danieleteti.it/zeromq-for-delphi/ https://my.oschina.net/zeroflamy/blog/109457 http://zer ...

  6. 阿里Java编程规范 学习笔记

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  7. 目录操作(PHP)

    1.创建目录(文件夹)mkdir("./test");2.删除目录(文件夹)只能删除空的文件夹rmdir("./test");3.移动目录(文件夹)rename ...

  8. codeforces 505C C. Mr. Kitayuta, the Treasure Hunter(dp)

    题目链接: C. Mr. Kitayuta, the Treasure Hunter time limit per test 1 second memory limit per test 256 me ...

  9. CocoaPods 安装相关问题

    (1)pod install还是pod update都卡在Analyzing dependencies不动. 解决方法: 其实原因在于以上两个命令执行时会升级CocoaPods的spec仓库,加一个参 ...

  10. 「LuoguP3384」【模板】树链剖分

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...