题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218

题解:先要确定这些点是不是属于最长递增序列然后再确定这些数在最长递增序列中出现的次数,如果大于1次显然是可能出现只出现1次肯定是必然出现。那么就是怎么判断是不是属于最长递增序列,这个只要顺着求一下最长递增标一下该点属于长度几然后再逆着求一下最长递减标一下该点属于长度几如果两个下标之和等于最长长度+1那么该点就属于最长递增序列,然后就是求1~len(len表示最长的长度)中各个长度出现的次数就行。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <vector>
  5. #define inf 0X3f3f3f3f
  6. using namespace std;
  7. const int M = 5e4 + 10;
  8. int a[M] , b[M] , dpa[M] , dpb[M] , vis[M];
  9. bool vs[M];
  10. int binsearch(int l , int r , int num) {
  11. int mid = (l + r) >> 1;
  12. int ans = 0;
  13. while(l <= r) {
  14. mid = (l + r) >> 1;
  15. if(b[mid] > num) r = mid - 1;
  16. else {
  17. ans = mid;
  18. l = mid + 1;
  19. }
  20. }
  21. return ans;
  22. }
  23. int binsearch2(int l , int r , int num) {
  24. int mid = (l + r) >> 1;
  25. int ans = 0;
  26. while(l <= r) {
  27. mid = (l + r) >> 1;
  28. if(b[mid] < num) r = mid - 1;
  29. else {
  30. ans = mid;
  31. l = mid + 1;
  32. }
  33. }
  34. return ans;
  35. }
  36. int main() {
  37. int n;
  38. scanf("%d" , &n);
  39. for(int i = 1 ; i <= n ; i++) scanf("%d" , &a[i]);
  40. int len = 0;
  41. b[0] = -1;
  42. for(int i = 1 ; i <= n ; i++) {
  43. if(a[i] > b[len]) {
  44. len++;
  45. b[len] = a[i];
  46. dpa[i] = len;
  47. continue;
  48. }
  49. else {
  50. int pos = binsearch(1 , len , a[i]);
  51. b[pos + 1] = min(b[pos + 1] , a[i]);
  52. dpa[i] = pos + 1;
  53. }
  54. }
  55. int len2 = 0;
  56. memset(b , inf , sizeof(b));
  57. for(int i = n ; i >= 1 ; i--) {
  58. if(a[i] < b[len2]) {
  59. len2++;
  60. b[len2] = a[i];
  61. dpb[i] = len2;
  62. }
  63. else {
  64. int pos = binsearch2(1 , len2 , a[i]);
  65. b[pos + 1] = max(b[pos + 1] , a[i]);
  66. dpb[i] = pos + 1;
  67. }
  68. }
  69. memset(vs , false , sizeof(vs));
  70. for(int i = 1 ; i <= n ; i++) {
  71. if(dpa[i] + dpb[i] == len + 1) {
  72. vis[dpa[i]]++;
  73. vs[i] = true;
  74. }
  75. }
  76. printf("A:");
  77. for(int i = 1 ; i <= n ; i++) {
  78. if(vis[dpa[i]] > 1 && vs[i]) printf("%d " , i);
  79. }
  80. printf("\n");
  81. printf("B:");
  82. for(int i = 1 ; i <= n ; i++) {
  83. if(vis[dpa[i]] == 1 && vs[i]) printf("%d " , i);
  84. }
  85. printf("\n");
  86. return 0;
  87. }

51nod 1218 最长递增子序列 V2(dp + 思维)的更多相关文章

  1. [51Nod 1218] 最长递增子序列 V2 (LIS)

    传送门 Description 数组A包含N个整数.设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS).A的LIS可 ...

  2. 51nod 1218 最长递增子序列 V2——LIS+思路(套路)

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 自己怎么连这种 喜闻乐见的大水题 都做不出来了…… 好像见过 ...

  3. [51Nod] 1218 最长递增子序列 V2

    如何判断一个元素是否一定在LIS中?设f[i]为以ai结尾的LIS长度,g[i]为以ai开头的LIS长度,若f[i]+g[i]-1==总LIS,那么i就一定在LIS中出现 显然只出现一次的元素一定是必 ...

  4. 51nod 1218 最长递增子序列 | 思维题

    51nod 1218 最长递增子序列 题面 给出一个序列,求哪些元素可能在某条最长上升子序列中,哪些元素一定在所有最长上升子序列中. 题解 YJY大嫂教导我们,如果以一个元素结尾的LIS长度 + 以它 ...

  5. 51nod 1134 最长递增子序列

    题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...

  6. 51nod 1376 最长递增子序列的数量(线段树)

    51nod 1376 最长递增子序列的数量 数组A包含N个整数(可能包含相同的值).设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递 ...

  7. LCS 51Nod 1134 最长递增子序列

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10.   Input 第1行:1个 ...

  8. 51NOD 1376 最长递增子序列的数量 [CDQ分治]

    1376 最长递增子序列的数量 首先可以用线段树优化$DP$做,转移时取$0...a[i]$的最大$f$值 但我要练习$CDQ$ $LIS$是二维偏序问题,偏序关系是$i<j,\ a_i< ...

  9. 51Nod 1376 最长递增子序列的数量 —— LIS、线段树

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 1376 最长递增子序列的数量 基准时间限制:1 秒 空 ...

随机推荐

  1. jplayer

    简介 jplayer是个用JavaScript写的完全免费和开源的媒体库(media library).作为jQuery插件的一员,使用jPlayer可以在你的网页上轻松加入跨平台的音乐和视频 使用方 ...

  2. 在 dotnet core (C#)下的颜色渐变

    直接使用等比例抽样算法,连同透明度一起计算. public IList<Color> ShadeColors(Color c1, Color c2, int resultCount) { ...

  3. SpringMVC项目案例之---数据的获取与显示

    数据的获取与显示 (一)功能 1.对用户输入的数据进行获取 2.将获取的数据显示到页面 3.使用了SpringMVC技术的注解方式 4.使用了过滤器,处理中文乱码问题 5.在web.xml中设置了访问 ...

  4. npm包开发与发布

    把通用的功能开发成npm包,便用使用和维护,更重要的是可以分享给广大的开发者,是不是很激动人心! 那么,步骤如下: 1.创建项目 创建项目目录,npm init ,根据需要输入配置信息(建完后也可以在 ...

  5. JS 中构造函数和普通函数的区别

    原来只是随意的了解了下 , 但是最近有点忘了 于是详细了解下 加深下印象. 1.构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写 2.构造函数和普通函数的区别在于:调用方式 ...

  6. 【POJ - 2236】Wireless Network (并查集)

    Wireless Network 这接翻译了 Descriptions 地震发生在东南亚.ACM(亚洲合作医疗团队)已经与膝上电脑建立了无线网络,但是一次意外的余震袭击,网络中的所有计算机都被打破了. ...

  7. 用命令将本地jar包导入到本地maven仓库

    [**前情提要**]在日常开发过程中,我们总是不可避免的需要依赖某些不在中央仓库,同时也不在本地仓库中的jar包,这是我们就需要使用命令行将需要导入本地仓库中的jar包导入本地仓库,使得项目依赖本地仓 ...

  8. Go包管理工具dep

    dep是一个golang依赖管理工具,需要在Go 1.7及更高的版本中使用. 1. 安装 安装dep工具的方式有很多种,如果是mac电脑的话,只需要如下命令: brew install dep 对于L ...

  9. android ——网络编程

    一.WebView 这个View就是一个浏览器,用于展示网页的. 布局文件: <LinearLayout xmlns:android="http://schemas.android.c ...

  10. 记一次 Windows MySQL 恢复

    0x00 事件 因为本地的服务器硬件出现故障,导致一台 Windows 系统的开发环境挂了,且无法短时间内恢复状态. 应急方案是使用了云上的系统重建了开发环境. 开发人员说需要挂了的那台 Window ...