C. Vasya and Robot(选择合适的二分对象)

, 看到题目很容易想到二分,否则没办法取得最优

, , 但是我脑子抽了,第一时间想到枚举每个点作为删除的最左端点,去二分最小的删除右端点

但是这样是没有单调性的。比如某个位置刚好满足到达终点

! ! 那么再往右多修改一个值,居然到不了终点了!!

, , c h e c k 所以,直接枚举修改区间长度,然后枚举每个区间去check

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int n,x[maxn],y[maxn],q,w;
char a[maxn];
bool isok(int len)
{
	for(int i=1;i+len-1<=n;i++)
	{
		int j=i+len-1;
		int sx=x[n]-(x[j]-x[i-1]),sy=y[n]-(y[j]-y[i-1]);
		sx=abs(sx-q),sy=abs(sy-w);
		if(sx+sy<=len&&(len-sx-sy)%2==0)	return true;
	}
	return false;
}
int main()
{
	cin >> n >> (a+1) >> q >> w;
	for(int i=1;i<=n;i++)
	{
		x[i]=x[i-1],y[i]=y[i-1];
		if(a[i]=='R')	x[i]++;
		else if(a[i]=='L')	x[i]--;
		else if(a[i]=='U')	y[i]++;
		else	y[i]--;
	}
	int l=0,r=n,ans=-1;
	while(r>=l)
	{
		int mid=l+r>>1;
		if( isok(mid) )	ans=mid,r=mid-1;
		else l=mid+1;
	}
	cout<<ans;
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106878897