https://codeforces.com/contest/1494/problem/C
这题就正部分的枚举第一个箱子推到哪个特殊的位置,然后看有多少箱子连起来了,再用lower/upper_bound找出有多少箱子在特殊位置,再加上没动的特殊的位置
负数部分再搞一遍一样的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,k,cnt,tot,cas,ans;
int a[maxl],b[maxl],pre[maxl];
bool vis[maxl];
char s[maxl];
inline void prework()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
{
int id=lower_bound(b+1,b+1+m,a[i])-b;
if(id>=1 && id<=m && a[i]==b[id])
pre[i]=1;
else
pre[i]=0;
}
for(int i=1;i<=n;i++)
pre[i]+=pre[i-1];
}
inline void mainwork()
{
int lans=0,rans=0,l=0,r=0,lb=0,rb=0;
for(int i=1;i<=n;i++)
if(a[i]>0)
{
l=i;
break;
}
if(l>0)
{
for(int i=1;i<=m;i++)
if(b[i]>0)
{
lb=i;
break;
}
if(lb>0)
{
r=l;
for(int i=lb;i<=m;i++)
{
if(b[i]<a[l])
continue;
while(r+1<=n && a[r+1]<=b[i]+(r-l+1))
r++;
int tmp=(upper_bound(b+1,b+1+m,b[i]+(r-l+1)-1)-b)-i;
rans=max(rans,pre[n]-pre[r]+tmp);
}
}
}
l=0,r=0,lb=0,rb=0;
for(int i=n;i>=1;i--)
if(a[i]<0)
{
r=i;
break;
}
if(r>0)
{
for(int i=m;i>=1;i--)
if(b[i]<0)
{
rb=i;
break;
}
if(rb>0)
{
l=r;
for(int i=rb;i>=1;i--)
{
if(b[i]>a[r])
continue;
while(l-1>=1 && a[l-1]>=b[i]-(r-l+1))
l--;
int tmp=i-(lower_bound(b+1,b+1+m,b[i]-(r-l+1)+1)-b)+1;
lans=max(lans,pre[l-1]+tmp);
}
}
}
ans=lans+rans;
}
inline void print()
{
printf("%d\n",ans);
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}