shuoj1936-D序列—最长上升子序列
Description
已知两个长度为N的数组A和B。下标从0标号至N-1。
如今定义一种D序列 (如果长度为L)。这样的序列满足下列条件:
1. 0 <= D[i] <= N-1
2. A[D[i]] < A[D[i+1]] (0 <= i < L-1)
3. B[D[i]] > B[D[i+1]] (0 <= i < L-1)
求满足条件的D序列的最大长度。
(事实上这样的序列叫做D序列的原因是:这道题是D题)
Input
多组数据,每组数据第一行是一个整数N。
(1 <= N <= 100000)
第二行中有N个正整数A[0]~A[N-1]。
第三行中有N个正整数B[0]~B[N-1]。
保证全部输入整数在int范围内。
Output
对每组数据。输出一个整数。表示D序列的最大长度L。
Sample Input
在这里a[ i ] > s[ j ]&&a[i]<=s[ j + 1 ]就应该把a[ i ]放在s[
j+1 ]的位置。
所以关键就是找出 j 就知道把a[ i ]放在哪了。
上面的两种方法就是用来寻找 j的 。(在这里lower_bound直接返回 j + 1 )
| 0 | 1 | 2 | 3 | 4 |
| 1 | 3 | |||
| 2 | 2 | |||
| 3 | 2 | 4 | ||
| 4 | 2 | 4 | 6 | |
| 5 | 2 | 4 | 5 | |
| 6 | 2 | 4 | 5 | 7 |
| 7 | 2 | 3 | 5 | 7 |
#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int s[100005];
vector<pair<int,int> > T;//能够用vector存,也能够直接用数组 pair<int ,int> T[100005]; int main()
{
int n;
while(~scanf("%d",&n)){
T.clear();//假设不初始或要出错用数组就不须要了
for(int i = 0;i<n;i++)scanf("%d",&a[i]);
for(int i = 0;i<n;i++)scanf("%d",&b[i]);
//假设用数组应该为T[i] = {a[i],b[i]};
for(int i = 0;i<n;i++)T.push_back(make_pair(a[i],b[i]));
//sort(T,T+n);
std::sort(T.begin(),T.end());//排序
for(int i= 0;i<n;i++)a[i] = T[i].second;//把排序后的数组b取出来放到a中
reverse(a,a+n);//导致
int len = 1; s[1] = a[0];//<span style="font-family: Arial, Helvetica, sans-serif;">第一个元素首先放入 s[1]</span>
for(int i = 1;i<n;i++){//dp的思想,逐个将a中元素增加s.
int t = a[i];
if(t>s[len])s[++len] = a[i];
else{
int p = lower_bound(s+1,s+len+1,t)-s;
s[p] = t;
}
}
printf("%d\n",len);
}
return 0;
}
方法(2)代码::
#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int s[100005];
vector<pair<int,int> > T; int main()
{
int n;
while(~scanf("%d",&n))
{
T.clear();
for(int i = 0;i<n;i++)scanf("%d",&a[i]);
for(int i = 0;i<n;i++)scanf("%d",&b[i]);
for(int i = 0;i<n;i++)T.push_back(make_pair(a[i],b[i]));
std::sort(T.begin(),T.end());
for(int i= 0;i<n;i++)a[i] = T[i].second;
reverse(a,a+n);
int len = 1;s[1] = a[0];
for(int i = 1;i<n;i++){
int t = a[i];
if(t>s[len]) s[++len] = a[i];
else{
int l = 1,r = len,mid;
int ans = 0;
while(l<=r)//这里的二分法採用了左闭右闭的思路
{
mid = (r+l)/2;
if(s[mid]<t){
l = mid+1;
ans=max(ans, mid);//ans即为思路中的j,j必定为s数组中小于t的最大的数
}
else r = mid-1;
}
s[ans+1] = t;
}
}
printf("%d\n",len);
}
return 0;
}
shuoj1936-D序列—最长上升子序列的更多相关文章
- 【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1807 题目大意: 给你一个长度为N(N<=105)的数列,数列中的0可以被其他数 ...
- 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹
一, 最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...
- HDU-4521 小明系列问题——小明序列 间隔限制最长上升子序列
题意:给定一个长度为N的序列,现在要求给出一个最长的序列满足序列中的元素严格上升并且相邻两个数字的下标间隔要严格大于d. 分析: 1.线段树 由于给定的元素的取值范围为0-10^5,因此维护一棵线段树 ...
- 【LCS,LIS】最长公共子序列、单调递增最长子序列
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 ...
- hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明
题目:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11313 湖师大的比赛,见我的另一篇水题题解,这里要说的 ...
- C语言 · 最长公共子序列 · 最长字符序列
算法提高篇有两个此类题目: 算法提高 最长字符序列 时间限制:1.0s 内存限制:256.0MB 最长字符序列 问题描述 设x(i), y(i), z(i)表示单个字符,则X={x( ...
- [HAOI2007]上升序列(最长上升子序列)
题目描述 对于一个给定的 S=\{a_1,a_2,a_3,…,a_n\}S={a1,a2,a3,…,an} ,若有 P=\{a_{x_1},a_{x_2},a_{x_3},…,a_{x_m}\ ...
- 【动态规划】【最长上升子序列】【贪心】bzoj1046 [HAOI2007]上升序列
nlogn求出最长上升子序列长度. 对每次询问,贪心地回答.设输入为x.当前数a[i]可能成为答案序列中的第k个,则若 f[i]>=x-k && a[i]>ans[k-1] ...
- POJ - 2533 Longest Ordered Subsequence与HDU - 1257 最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)(LIS)
Longest Ordered Subsequence A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let ...
随机推荐
- Mybatis之MySql批量insert后返回主键
需求:使用批量插入后,需要insert之后的每一条记录的ID 注意:Mybatis3.3.1的版本以后支持批量插入后返回主键ID 示例: domin.java: public class User { ...
- java中BufferedReader 有什么用
这个类就是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的. BufferedReader buffer ...
- 【BZOJ 1266】 [AHOI2006]上学路线route
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 第一问是个最短路. 第二问. 利用第一问floyd算出来的任意两点之间的最短路. 那么枚举每一条边(x,y) 如果w[1][x]+c ...
- ANY和ALL
8.在WHERE中使用ANY和ALL条件 字段 >ANY(值1,值2,值3...):字段值大于集合任何一个 值就算满足条件. 字段 >ALL(值1,值2,值3... ...
- angular-基础
AngularJs特点: 1.依赖注入 2.模块化 3.双向绑定 4.语义化标签 当网页加载完毕,AngularJS 自动开启. ng-app 指令告诉 AngularJS,<div> 元 ...
- Android自己定义矩形及selector、shape的使用
[声明]转载请注明出处.此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail --每天写一篇博客.每天做一点技术积累! Android自己定义矩形及selector ...
- zzulioj--1633--Happy Thanksgiving Day - Hateable Name(字符串筛选)
1633: Happy Thanksgiving Day - Hateable Name Time Limit: 1 Sec Memory Limit: 128 MB Submit: 75 ...
- select2多选
在TCX_1710项目中的拒绝代码配置页面可以选择多个拒绝字段,效果图如下 代码中需要注意的有以下地方:图1为提交保存时对多选数据的获取,图2为修改是对多选数据的回显 对于多选框宽度太窄的问题,可以参 ...
- Sql Server 2012数据库的安装【自己一点一点敲的】
Sql Server 2012数据库的安装 1.到微软官网上下载 下载链接为:https://www.microsoft.com/zh-cn/download/details.aspx?id=2906 ...
- vue 初始化项目模板报错
E:\xiaogezi.cn\vue>vue init webpack myProject vue-cli · Failed to download repo vuejs-templates/w ...