这道题可以抽象为最长不递减子串
给定 5 4 3 2 1
一个序列 — 3 4 5 1 2 2
对应的index 3 2 1 5 4 4
看可以发现1 4 4(对应5 2 2)满足题目要求
求这样的子串有O(NlogN)的算法
我叫他为贪吃蛇法
百度最长上升子序列NLOGN法
#include <bits/stdc++.h>
using namespace std;
int favor[100020];
int emm[1200020];
int snake[1200020];
std::map<int, int> mymap;
int main(){
int n,M,K;
cin>>n>>M;
for (int i = 1; i <= M; ++i){
cin>>favor[i];
mymap[favor[i]]=i;
}
cin>>K;
for (int i = 1; i <= K; ++i){
cin>>emm[i];
emm[i]=mymap[emm[i]];//根据映射替换数据
}
int cnt=0;
for(int j=1;j<=K;j++){
if(!emm[j]) continue;//不喜欢的颜色不管
if(emm[j]>=snake[cnt]){
snake[++cnt]=emm[j];//贪吃蛇加长
}
else{//找到贪吃蛇内部的一个位置
int l=1;
int r=cnt;
while(l<r){//二分查找
int mid=(l+r)>>1;
if(snake[mid]>emm[j]){
r=mid;
}
else l=mid+1;
}
snake[l]=emm[j];
}
}
cout<<cnt<<endl;
return 0;
}