LCIS


Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 440    Accepted Submission(s): 201


Problem Description


a1,a2,...,an and  b1,b2,...,bm. He wants find a longest common subsequence that consists of consecutive values in increasing order.



Input

T, indicating the number of test cases. For each test case:

The first line contains two integers  n and  m  (1≤n,m≤100000) -- the length of two sequences. The second line contains  n integers:  a1,a2,...,an  (1≤ai≤106). The third line contains  n integers:  b1,b2,...,bm  (1≤bi≤106).

There are at most  1000 test cases and the sum of  n and  m does not exceed  2×106.


Output


For each test case, output the length of longest common subsequence that consists of consecutive values in increasing order.


Sample Input


3
3 3
1 2 3
3 2 1
10 5
1 23 2 32 4 3 4 5 6 1
1 2 3 4 5
1 1
2
1

 


Sample Output

1
5
0


题意:给定两个序列,求它们的最长公共递增子序列的长度, 并且这个子序列的值是连续的。


分析:我们可以先处理a,b的每个数的最长连续长度,最终取两者最小值的最大值,状态转移方程:dp[a[i]] = max(dp[a[i]], dp[a[i]-1] + 1);



AC代码:


#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<iostream>
using namespace std;
#define MMAX 110000
int a[MMAX],b[MMAX],dpa[MMAX],dpb[MMAX];
int main()
{
cout.sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
int n,m;
cin>>n>>m;
memset(dpa,0,sizeof(dpa));
memset(dpb,0,sizeof(dpb));
int maxx=0;
for(int i=1; i<=n; i++)
{
cin>>a[i];
dpa[a[i]]=dpa[a[i]-1]+1;
maxx=max(maxx,a[i]);
}
for(int i=1; i<=m; i++)
{
cin>>b[i];
dpb[b[i]]=dpb[b[i]-1]+1;
maxx=max(maxx,b[i]);
}
int ans=0;
for(int i=1; i<=maxx; i++)
ans=max(ans,min(dpa[i],dpb[i]));
cout<<ans<<endl;
}
}