比赛的时候,被卡掉了,坑,O(n)转移吧
以下超时代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a[100005],b[100005];
int has[1000005],has1[1000005];
int Max(int a,int b)
{
return a>b?a:b;
}
int Min(int a,int b)
{
return a>b?b:a;
}
int main()
{
int t,n1,n2,j,k,max;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n1,&n2);
for(int i=1; i<=1000000; i++)
has[i]=has1[i]=0;
for(int i=1; i<=n1; i++)
{
scanf("%d",&a[i]);
has[a[i]]=Max(has[a[i]-1]+1,has[a[i]]);
// printf("%d\n",has[a[i]]);
}
for(int i=1; i<=n2; i++)
{
scanf("%d",&b[i]);
has1[b[i]]=Max(has1[b[i]-1]+1,has1[b[i]]);
// printf("%d\n",has1[b[i]]);
}
int ans=0;
// printf("%d\n",Max(ans,Min(has[1],has1[1])));
for(int i=1;i<=1000000;i++)
ans=Max(ans,Min(has[i],has1[i]));
printf("%d\n",ans);
}
}
以下AC代码,省掉了初始化,和一些多余的操作,学到老活到老。
#include<cstdio>
#include<algorithm>
using namespace std;
int f[100005],g[100005],pa[1000005],pb[1000005];
int main()
{
int t;scanf("%d",&t);
while(t--)
{
int n,m,ans=0,x;scanf("%d%d",&n,&m);
while(n--)
{
scanf("%d",&x);pa[x]=t+1;
pa[x-1]==t+1?f[x]=f[x-1]+1:f[x]=1;
}
while(m--)
{
scanf("%d",&x);pb[x]=t+1;
pb[x-1]==t+1?g[x]=g[x-1]+1:g[x]=1;
if(pa[x]==t+1)ans=max(ans,min(f[x],g[x]));
}
printf("%d\n",ans);
}
}
以下把超时代码的初始化改成memset,也能过,ps:顺手测试了fill,也超时,吐槽一下,之前不知道哪题,for循环初始化比memset还快…
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a[100005],b[100005];
int has[1000005],has1[1000005];
int Max(int a,int b)
{
return a>b?a:b;
}
int Min(int a,int b)
{
return a>b?b:a;
}
int main()
{
int t,n1,n2;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n1,&n2);
for(int i=0;i<=1000000;i++)
has[i]=has1[i]=0;
for(int i=1; i<=n1; i++)
{
scanf("%d",&a[i]);
has[a[i]]=Max(has[a[i]-1]+1,has[a[i]]);
// printf("%d\n",has[a[i]]);
}
for(int i=1; i<=n2; i++)
{
scanf("%d",&b[i]);
has1[b[i]]=Max(has1[b[i]-1]+1,has1[b[i]]);
// printf("%d\n",has1[b[i]]);
}
int ans=0;
// printf("%d\n",Max(ans,Min(has[1],has1[1])));
for(int i=1;i<=n1;i++)
if(has[a[i]]&&has1[a[i]])
ans=Max(ans,Min(has[a[i]],has1[a[i]]));
printf("%d\n",ans);
}
}