艾瑞莉娅
【题目描述】
蒟蒻的danny是我的队友,很爱玩刀妹,这一天发现对方也有个刀妹,同在上路对线。
刀妹有个技能,可以在突进捅死小兵的时候继续继续往下突进(吼吼),在她们对线的时候,我方凯隐在暗中观察,发现敌我刀妹的突进路线可能会重复(假装小兵被捅死了后还可能会被另一个刀妹捅)。
我方凯隐想知道有哪几个小兵是死了两次的,也想知道两个刀妹捅死了两次的小兵的顺序。
【思路】
咳咳,本人出的题,原博客地址:https://www.cnblogs.com/614685877--aakennes/p/12663440.html
我觉得应该没有写不出来的组吧,没有吧,没有吧(感觉用这种语气十分智障)
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>//map的库,当然可以不用map直接用数组对应
using namespace std;
const int maxn=2005+5,maxe=2005+5,INF=0x3f3f3f3f;
int n,m,t,p,q,f[maxe],a[maxn],b[maxn],low[maxn];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}//朴素快读
int main(){
freopen("a.in","r",stdin);
n=read();
p=read();
q=read();
int maxmax=0;
map<int,int> mp;
for(register int i=1;i<=p-1;i++)a[i]=read(),mp[a[i]]=i;
int len=0;//这里对第一组序列进行对应,
for(register int i=1;i<=q-1;i++){
b[++len]=read();//如果第二组序列中出现了前一组序列的数的位置就加到数组里
if(mp.find(b[len])==mp.end())len--;//没有就删除
else b[len]=mp[b[len]];
}
//for(int i=1;i<=len;i++)cout<<b[i]<<" ";
int len1=1;
low[1]=b[1];
for(register int i=2;i<=len;i++){
if(low[len1]<b[i])low[++len1]=b[i];
else low[lower_bound(low+1,low+len1+1,b[i])-low]=b[i];
}//找一下新序列中最长上升子序列就是结果,想成友好城市也行
printf("%d
",len1);
}