Codeforces1117C. Magic Ship 二分

https://codeforces.com/contest/1117/problem/C
风先走
风走的天数同时 船叠加走
(0,0)->(4,6)
mid=5天 1个T余2
风UUUUU
船RRRRU
前缀和数组

#include <bits/stdc++.h>
using namespace std;
 
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define pb push_back
#define mp make_pair
#define IO ios::sync_with_stdio(false)
#define fi first
#define se second
 
typedef long long ll;
typedef pair<ll,ll> pll;
const int maxn=4e5+5;
const int maxm=1e6+5;
const ll INF=0x3f3f3f3f;
const ll mod=1e9+7;
const double PI=acos(-1.0);

ll n,m,k,t,minn=INF,maxx,cnt,sum,tmp,f;
string s;
int vis[maxm];
pll a[maxn];
ll x1,y1,x2,y2;
bool check(ll mid){
	ll x=x1+(mid/n)*a[n].fi+a[mid%n].fi;
	ll y=y1+(mid/n)*a[n].se+a[mid%n].se;	//风走 累加 
	if( abs(x-x2) + abs(y-y2)<=mid )	//船走
		return true;
	return false; 
}
int main(){
	
	cin>>x1>>y1>>x2>>y2;
	cin>>n>>s;
	s=" "+s;
	rep(i,1,n){
		if(s[i]=='U')	a[i]=mp(a[i-1].fi,a[i-1].se+1);
		else if(s[i]=='D')	a[i]=mp(a[i-1].fi,a[i-1].se-1);
		else if(s[i]=='L')	a[i]=mp(a[i-1].fi-1,a[i-1].se);
		else	a[i]=mp(a[i-1].fi+1,a[i-1].se);	//前缀和 
	}
	//风和船行驶可以叠加 风走mid天 卡船行驶天数是否够
	ll l=0,r=1e18,ans=-1;	//00-1e91e9 2e9  起终点一样0天 
	while(l<=r){
		ll mid=(l+r)/2;
		if(check(mid)){
			ans=mid;
			r=mid-1;	//天数更短 
		}
		else
			l=mid+1;
	}
	cout<<ans<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值