codeforces1494C. 1D Sokoban

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;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/114298045
今日推荐