二路单调自增子序列模型【acdream 1216】
题目:acdream 1216 Beautiful
People
题意:每一个人有两个值,能力值和潜力值,然后要求一个人的这两个值都严格大于第二个人的时候,这两个人才干呆在一块儿,给出很多人的值,求最多有多少个人?
分析:非常easy想到是个单调非增模型,假设用O(n*n)的写法的话,会超时!
那么我们就要用二分优化来找。
我们能够先按第一个值 x 从小到大排序,然后按第二个值从大到小排序,这种话找出的最长个数是没有错的。(想想为什么)
假如这样一个例子:
5
1 10
2 12
3 5
3 1
4 3
6 7
首先dp数组仅仅有第一,二组例子:1 10 和2 12
然后第三个例子替换第一组:3 5 和 2 12 ,看看这组例子,发现不满足,可是他总的长度不会变,可是这样保存的话能保证后面出来的数可以最长。所以要想办法保存路径
然后第四组例子替换第三组:3 1 和 2 12
然后第5组例子替换第二组: 3 1 和 4 3 是不是满足条件了,并且最大值值变的更小了,
然后第六组例子加在后面:3 1 和 4 3 和 6 7 ,最大值
最后全部值的二分搜索的值为:1 2 1 1 2 3
那么发现保存路径也简单了。
然后从这个值里面输出一个递减的初始数组标号就能够了、
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 110000;
struct Node
{
int x,y;
int num,count;
};
Node a[N];
int cmp(Node a,Node b)
{
if(a.x!=b.x)
return a.x<b.x;
if(a.y!=b.y)
return a.y>b.y;
}
int dp[N],mark[N]; int Bin_Search(int l,int r,int x)
{
while(l<=r)
{
int mid = (l+r)/2; //假如要求相等的情况下,返回较小的值。
if(dp[mid]==x)
return mid;
else if(dp[mid]<=x)
l=mid+1;
else
r=mid-1;
}
return l;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].num=i;
}
sort(a+1,a+n+1,cmp);
memset(dp,0x3f3f3f3f,sizeof(dp));
int ans=0;
int len = 1;
for(int i=1;i<=n;i++)
{
int tmp=Bin_Search(1,len,a[i].y); //lower_bound(dp+1,dp+1+n,a[i].y)-dp;
if(tmp==len)
len++;
dp[tmp] = a[i].y;
mark[i] = tmp;
ans = max(ans,tmp);
}
printf("%d\n",ans);
for(int i=n;i>=1;i--)
{
//printf("xx%d ",mark[i]);
if(mark[i]==ans)
{
printf("%d",a[i].num);
if(ans!=1)
printf(" ");
ans--;
}
}
printf("\n");
}
return 0;
}
二路单调自增子序列模型【acdream 1216】的更多相关文章
- ACdream 1216 (ASC训练1) Beautiful People(DP)
题目地址:http://acdream.info/problem? pid=1216 这题一開始用的是线段树.后来发现查询的时候还须要DP处理.挺麻烦..也就不了了之了..后来想到,这题事实上就是一个 ...
- hdu1087 Super Jumping! Jumping! Jumping!---基础DP---递增子序列最大和
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1087 题目大意: 求递增子序列最大和 思路: 直接dp就可以求解,dp[i]表示以第i位结尾的递增子 ...
- ACdream 1216——Beautiful People——————【二维LIS,nlogn处理】
Beautiful People Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (J ...
- 九度OJ-1112-导弹拦截-最长不增子序列
题目1112:拦截导弹 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5218 解决:2603 题目描述: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺 ...
- 最长递增子序列(Longest Increase Subsequence)
问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8 ...
- [Optimization] Dynamic programming
“就是迭代,被众人说得这么玄乎" “之所以归为优化,是因为动态规划本质是一个systemetic bruce force" “因为systemetic,所以比穷举好了许多,就认为是 ...
- nyoj 214——单调递增子序列(二)——————【二分搜索加dp】
单调递增子序列(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长 ...
- 浅谈单调栈 By cellur925
这位dalao的单调栈文章很棒!我写的是他的题单233. http://www.cnblogs.com/COLIN-LIGHTNING/p/8474668.html 一.单调栈的一般写法 ;i< ...
- 最长上升子序列(LIS)长度及其数量
例题51Nod-1376,一个经典问题,给出一个序列问该序列的LIS以及LIS的数量. 这里我学习了两种解法,思路和代码都是参考这两位大佬的: https://www.cnblogs.com/reve ...
随机推荐
- 基于Visual C++2013拆解世界五百强面试题--题13-找最大公共子字符串
编程实现:找出两个字符串中最大公共子字符串,如"abccade"和"dgcadde"的最大子字符串为"cad". 如果不考虑效率的话直接比较 ...
- ++i和i++哪个效率高?
这个问题需要分两种情况来解说: 1.当变量i的数据类型是c++语言默认提供的类型的话,他们的效率是一样的. int a,i=0; a=++i;汇编代码如下: int a,i=0; 01221A ...
- C++ Primer的课后规划问题的第八章
1.写通常需要一个参数(字符串的地址).字符串和打印功能. 只要.假设提供了第二个参数(int种类),而这个参数不0,的次数的函数打印串数量为该功能将被称为(意,字符串的打印次数不等于第二个參数的值. ...
- python下module、package导入
#encoding=utf-8"""模块:1.import demo #导入demo.py下的所有的函数,调用方法为:demo.function()2.from demo ...
- C# inherit
Case:class A has a construct. class B is inherit from class A and B also has a construct. What's the ...
- C#中类的运用(Eighth day)
又到了总结知识的时刻了,今天在云和学院学习了类的运用,下面是今天所学知识的总结: 理论: 类的定义语法: [访问修饰符] class 类名 { 成员; // 1.通过字段来描述类别信息的变量 ... ...
- ListView列表项
方法,在xml文件中添加一个ListView,然后在MainActivity中 private ListView listView; private ArrayAdapter<String> ...
- NOIP2014解题报告
day 1 1.生活大爆炸版石头剪刀布(rps) 直接按照题意模拟即可 #include<cstdio> #include<algorithm> #include<cst ...
- 【转载】Google Analytics 使用图文全攻略
转载自:Google Analytics 使用图文全攻略 最近一段时间,因为工作的需要,小励使用GA(GA是Google Analytics的简称)比较频繁,所以花时间研究了一下,从不太了解到会使用( ...
- Django forms 关于select和checkbox设置初始选中值及让前端选中指定值
Django的forms和models一样很牛逼.他有两种功能,一是生成form表单,还有就是form表单的验证. 这里主要说一下生成form表单时经常用到的需要设置 初始值 / 默认值 的情况. 1 ...