【JZOJ4810】【NOIP2016提高A组五校联考1】道路规划
2024-09-06 12:43:02
题目描述
输入
输出
样例输入
5
1 4 5 2 3
3 4 2 1 5
样例输出
3
数据范围
样例解释
解法
模型显然。
设第一列为a[],第二列为b[],f[i]为前i个数的最大答案。
顺序枚举a,则f[i]=max(f[k]+1)(b[k]<b[i])。
最长不下降子序列。
代码
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define ln(x,y) int(log(x)/log(y))
#define sqr(x) ((x)*(x))
using namespace std;
const char* fin="aP2.in";
const char* fout="aP2.out";
const int inf=0x7fffffff;
const int maxn=100007,maxt=maxn*4;
int n,i,j,k,ans;
int f[maxn],c[maxt];
int tong[maxn];
int a[maxn];
void change(int l,int r,int t,int v,int v1){
int mid=(l+r)/2;
if (l==r){
c[t]=max(c[t],v1);
return;
}
if (v<=mid) change(l,mid,t*2,v,v1);
else change(mid+1,r,t*2+1,v,v1);
c[t]=max(c[t*2],c[t*2+1]);
}
int getmax(int l,int r,int t,int v1,int v2){
int mid=(l+r)/2;
if (l>v2 || r<v1) return 0;
if (l>=v1 && r<=v2) return c[t];
return max(getmax(l,mid,t*2,v1,v2),getmax(mid+1,r,t*2+1,v1,v2));
}
int main(){
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&j),tong[j]=i;
for (i=1;i<=n;i++) scanf("%d",&j),a[i]=tong[j];
for (i=1;i<=n;i++){
f[i]=getmax(1,n,1,a[i]+1,n)+1;
change(1,n,1,a[i],f[i]);
ans=max(ans,f[i]);
}
printf("%d",ans);
return 0;
}
最新文章
- 开源遥感平台opticks插件开发指南
- 使用图灵机器人API实现聊天机器人
- jq 版的tab切换
- 烂泥:vcenter通过模板部署vm
- ASP.NET Web API 实现客户端Basic(基本)认证 之简单实现
- python继承
- IDEA激活服務器
- get 与post 的接收传值方式
- jquery.layout框架分割线
- java递归所有文件
- Android ListView滑动底部自动加载更多
- winform中的 datagriview 字段自动填充长度
- JPA 映射单向多对一的关联关系
- Android学习笔记(27):日历视图Calendar
- 随机逻辑回归random logistic regression-特征筛选
- 浅谈Java语言中ArrayList和HashSet的区别
- 阅读ARM Memory(L1/L2/MMU)笔记
- 震惊!最全PyCharm教程
- json文本和json对象之间的转换
- 【err】VIDEOIO ERROR: V4L: index 0 is not correct!Unable to connect to camera