题目: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;elser=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;
}

转载于:https://www.cnblogs.com/zfyouxi/p/4091478.html

二路单调自增子序列模型【acdream 1216】相关推荐

  1. 【动态规划专题】最长上升子序列模型

    题目 算法 A.AcWing 895. 最长上升子序列 模板 B.AcWing1017. 怪盗基德的滑翔翼 最长上升子序列/最长下降子序列 C.AcWing 1014. 登山 最长上升子序列/最长下降 ...

  2. ACwing 895 - 最长上升子序列(最长上升子序列模型)

    给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数N. 第二行包含N个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. 数据范围 1 ≤ N ≤ ...

  3. C++---最长上升子序列模型---导弹防御系统(每日一道算法2023.3.5)

    注意事项: 本题的dp:"线性dp-最长上升子序列的长度" 本题的贪心(单调队列):"最长上升子序列模型-拦截导弹" 下面思路只讲如何运用这些东西来解这道题 强 ...

  4. 最长上升子序列模型 AcWing 1010. 拦截导弹

    最长上升子序列模型 AcWing 1010. 拦截导弹 原题链接 AcWing 1010. 拦截导弹 算法标签 DP 线性DP 最长上升子序列 思路 摘自该题解 代码 #include<bits ...

  5. 动态规划——最长上升子序列模型

    最长上升子序列 给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数 N. 第二行包含 N 个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. ...

  6. [AcWing] 1012. 友好城市(C++实现)最长上升子序列模型、较为特殊

    [AcWing] 1012. 友好城市(C++实现)最长上升子序列模型 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总 ...

  7. ACdream 1216 Beautiful People 二路最长上升子序列

    题目描述: Description The most prestigious sports club in one city has exactly N members. Each of its me ...

  8. 拦截导弹(dp【最长上升子序列模型】 + 贪心)

    AC Wing 1010 拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度 ...

  9. 【HDU - 1025】Constructing Roads In JGShining's Kingdom(dp最长上升子序列模型 + 二分优化)

    题干: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

最新文章

  1. 项目总监批评程序员穿大裤衩上班情商低!程序员一气之下要离职!项目已到一半了,总监着急发帖求助!...
  2. 网易视频云分享:流媒体技术介绍(上篇)
  3. 温州大学《深度学习》课程课件(十、人脸识别与神经风格迁移)
  4. php7连接mongodb,批量添加数据
  5. 【STM32 .Net MF开发板学习-18】GPRS遥控智能小车
  6. leetcode 1178. 猜字谜(位运算)
  7. LeetCode 215. 数组中的第K个最大元素(快速排序)
  8. suse linux 11如何分区,新手发帖,关于SUSE11挂载磁盘阵列并分区的问题
  9. 2、生成一个PHP扩展框架
  10. php自动跳转函数,迅睿CMS 重写控制网站自动跳转函数
  11. Python安装库Could not find a version that satisfies the requirement requests (from versions: none)
  12. [转载] python中的MySQLdb模块
  13. 关于如何使用IfcRelAggregates来对IFC中的元素进行关联
  14. 微信 qq浏览器服务器,QQ浏览器与微信团队合作推出“微信电脑版”
  15. wordpress主题制作,wordpress主题模板制作
  16. 【51单片机】74HC595串转并 使用
  17. 项目开发流程_以房地产项目总的视角,谈谈项目开发流程
  18. 用html做一个漂亮的网站,个人网页,css
  19. linux内核 自旋锁示例,自旋锁(示例代码)
  20. 恒达高停车场信息管理系统的分析与设计

热门文章

  1. 如何使用 WinUSB 与 USB 设备 (USBDevice) 通信
  2. 精通CSS高级Web标准解决方案(第2版)学习笔记
  3. IDUdpServer研究心得
  4. python 3d绘图立方体_python绘制3D立方体
  5. 7 orm 有批量更新_2020.12.24更新公告
  6. python日志_python 日志模块
  7. android日历编程,设置日历并添加 1天_android-calendar_开发99编程知识库
  8. PostgreSQL11.7逻辑复制压测
  9. 百度关键词点击ios_百度推广关键词点击价格高,如何处理?
  10. 表单设置默认值_你还不知道表单怎么设计吗?看这里!