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