【嘤嘤嘤组一试】艾瑞莉娅

艾瑞莉娅


【题目描述】

蒟蒻的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\n",len1);
}

猜你喜欢

转载自www.cnblogs.com/614685877--aakennes/p/12902310.html