제출 #1329051

#제출 시각아이디문제언어결과실행 시간메모리
1329051Jawad_Akbar_JJ생물 실험 (IZhO13_expgorl)C++20
0 / 100
1 ms344 KiB
#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;
#define ld long double
const int N = 1<<17;
ld dx[N], dy[N], x[2], y[2], k;
int n;

ld sq(ld a){
	return a * a;
}

ld dist(ld x1, ld y1, ld x2, ld y2){
	return sqrtl(sq(x1 - x2) + sq(y1 - y2));
}

void get(string s){
	for (int i=1;i<s.size();i++){
		dx[i] = dx[i-1], dy[i] = dy[i-1];
		if (s[i] == 'L')
			dx[i]--;
		if (s[i] == 'R')
			dx[i]++;
		if (s[i] == 'F')
			dy[i]++;
		if (s[i] == 'B')
			dy[i]--;
	}
}

ld poss(int i){
	int L = 0, R = k - 1;
	while (L + 2 < R){
		int mid = (L + R) / 2;
		ld X = x[0] + dx[i] + mid * dx[n], Y = y[0] + dy[i] + mid * dy[n];
		if (dist(X, Y, x[1], y[1]) <= dist(X+dx[n], Y+dy[n], x[1], y[1]))
			R = mid;
		else
			L = mid;
	}
	ld mn = 1e9;
	for (int j=L-10;j<=L+10;j++){
		if (j < 0 or j >= k)
			continue;
		ld X = x[0] + dx[i] + j * dx[n], Y = y[0] + dy[i] + j * dy[n];
		mn = min(mn, dist(X, Y, x[1], y[1]));
	}
	return mn;
}

int main(){
	cout<<fixed<<setprecision(10);
	string s;
	cin>>k>>s>>x[0]>>y[0]>>x[1]>>y[1];
	n = s.size(), s = '0' + s;

	get(s);
	ld mn = 1e9, mx = 0;

	for (int i=0;i<=n;i++){
		mx = max(mx, dist(x[0] + dx[i], y[0] + dy[i], x[1], y[1]));
		mx = max(mx, dist(x[0] + dx[i] + (k - 1) * dx[n], y[0] + dy[i] + (k-1) * dy[n], x[1], y[1]));
		// mn = max(mn, dist(x[0] + dx[1], y[0] + dy[1], x[1], y[1]));

		mn = min(mn, poss(i));
	}
	cout<<mn<<" "<<mx<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...