This problem two arrays do not have duplicate numbers, with the nlogn of LCS again fit
#include <iostream>#include<string>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<algorithm>#include<stack>#include<queue>#include<cctype>#include<vector>#include<iterator>#include<Set>#include<map>#include<sstream>using namespacestd;#defineMem (A, B) memset (A,b,sizeof (a))#definePF printf#defineSF scanf#defineSPF sprintf#definePB Push_back#defineDebug printf ("!\n")#defineMAXN 1005#defineMAX (A, b) a>b?a:b#defineBlank pf ("\ n")#defineLL Long Long#defineAll (x) X.begin (), X.end ()#defineINS (x) Inserter (X,x.begin ())#definePqueue priority_queue#defineINF 0x3f3f3f3fintn,m,v;intQ,p,top;inta[ -* -],b[ -* -],c[ -* -],pos[ -* -],stk[ -* -];voidLisintLen) {Mem (Stk,0); Top=0; stk[0] = -1; for(intI=1; i<=len;i++) { if(c[i]>Stk[top]) {stk[++top] =C[i]; } Else { intlo=1, hi=Top,mid; while(lo<=hi) {Mid= (Lo+hi) >>1; if(C[i]>stk[mid]) lo = mid+1; ElseHi = Mid-1; } Stk[lo]=C[i]; } }}intMain () {inti,j; intT,kase=1; SF ("%d",&t); while(t--) {SF ("%d%d%d",&n,&p,&q); Mem (POS,0); Mem (c,0); V=1; for(i=1; i<=p+1; i++) {SF ("%d",&A[i]); Pos[a[i]]=i; } for(i=1; i<=q+1; i++) {SF ("%d",&B[i]); if(Pos[b[i]]) c[v++] =Pos[b[i]]; } lis (v); PF ("Case %d:%d\n", kase++, top); }}
UVA 10635 LCS Turn lis