Submission #1546867


Source Code Expand

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>

using namespace std;
long long x_1, y_1, x_2, y_2, sw;
long long N;
long long X[200000], Y[200000];
long long n;
vector<pair<long long, long long> > fountains;
long long a[200000], dp[200000], len;
long long p_min, p_max, p;

int main() {

	scanf("%lld %lld %lld %lld", &x_1, &y_1, &x_2, &y_2);
	scanf("%lld", &N);
	for (int i = 0; i < N; i++) {
		scanf("%lld %lld",&X[i], &Y[i]);
	}

	if (x_1 > x_2) { 
		sw = x_1; x_1 = x_2; x_2 = sw; 
		sw = y_1; y_1 = y_2; y_2 = sw;
	}
	if (y_1 > y_2) {
		y_1 = -y_1;
		y_2 = -y_2;
		for (int i = 0; i < N; i++) {
			Y[i] = -Y[i];
		}
	}

	/*一直線だった時の処理をここら辺に書く*/

	if (x_1 == x_2) {
		/*間に噴水があるか調べる*/
		for (int i = 0; i < N; i++) {
			if (X[i] == x_1 && y_1 < Y[i] && Y[i] < y_2) {
				/*間に噴水がある*/
				printf("%.15Lf\n", (y_2 - y_1) * 100 - 20 + 40 * atan((long double)1));
				return 0;
			}
		}
		/*噴水はない*/
		printf("%lld\n", (y_2 - y_1) * 100);
		return 0;
	}

	if (y_1 == y_2) {
		/*間に噴水があるか調べる*/
		for (int i = 0; i < N; i++) {
			if (Y[i] == y_1 && x_1 < X[i] && X[i] < x_2) {
				/*間に噴水がある*/
				printf("%.15Lf\n",(x_2 - x_1) * 100 - 20 + 40 * atan((long double)1));
				return 0;
			}
		}
		/*噴水はない*/
		printf("%lld\n", (x_2-x_1)*100);
		return 0;
	}

	/*一直線じゃなかった場合*/

	for (int i = 0; i < N; i++) {
		if (x_1 <= X[i] && X[i] <= x_2 && y_1 <= Y[i] && Y[i] <= y_2) {
			fountains.push_back(make_pair(X[i], Y[i]));
		}
	}
	sort(fountains.begin(), fountains.end());
	/*最長増加部分列*/
	len = 0;
	n = fountains.size();
	if (n > 0) {
		for (int i = 0; i < n; i++) {
			a[i] = fountains[i].second;
		}

		len = 1;
		dp[0] = a[0];
		for (int i = 1; i < n; i++) {
			p_min = 0;
			p_max = len;
			while (p_min < p_max) {
				p = (p_min + p_max) / 2;
				if (dp[p] > a[i]) { p_max = p; }
				else { p_min = p + 1; }
			}
			if (p_min == len) { len++; }
			dp[p_min] = a[i];
			for (int j = 0; j < len; j++) {
			}
		}
	}
	/*(x_2-x_1) + (y_2-y_1)個の道を通って、その間にlen個の噴水を通る。
	100 * ((x_2-x_1) + (y_2-y_1))+(- 20 + 5pi) * len
	*/
	if (len <= x_2 - x_1 && len <= y_2 - y_1) {
		printf("%.15Lf\n", 100 * ((x_2 - x_1) + (y_2 - y_1)) + (-20 + 20 * atan((long double)1)) * len);
	}
	else {
		/*この場合を忘れていたっぽい…このときは、len-1個の噴水でショートカットし、1個の噴水で遠回りをする。
		100 * ((x_2-x_1) + (y_2-y_1))+(- 20 + 5pi) * (len-1) - 20 + 10pi
		*/
		printf("%.15Lf\n", 100 * ((x_2 - x_1) + (y_2 - y_1)) + (-20 + 20 * atan((long double)1)) * (len - 1) - 20 + 40 * atan((long double)1));
	}
	
}

Submission Info

Submission Time
Task C - Fountain Walk
User tah
Language C++14 (GCC 5.4.1)
Score 900
Code Size 2894 Byte
Status AC
Exec Time 67 ms
Memory 10736 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:19:54: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld %lld %lld %lld", &x_1, &y_1, &x_2, &y_2);
                                                      ^
./Main.cpp:20:19: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld", &N);
                   ^
./Main.cpp:22:34: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld %lld",&X[i], &Y[i]);
                                  ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 900 / 900
Status
AC × 3
AC × 47
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, sample_01.txt, sample_02.txt, sample_03.txt, subtask_1_01.txt, subtask_1_02.txt, subtask_1_03.txt, subtask_1_04.txt, subtask_1_05.txt, subtask_1_06.txt, subtask_1_07.txt, subtask_1_08.txt, subtask_1_09.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt, subtask_1_17.txt, subtask_1_18.txt, subtask_1_19.txt, subtask_1_20.txt, subtask_1_21.txt, subtask_1_22.txt, subtask_1_23.txt, subtask_1_24.txt, subtask_1_25.txt, subtask_1_26.txt, subtask_1_27.txt, subtask_1_28.txt, subtask_1_29.txt, subtask_1_30.txt, subtask_1_31.txt, subtask_1_32.txt, subtask_1_33.txt, subtask_1_34.txt, subtask_1_35.txt, subtask_1_36.txt, subtask_1_37.txt, subtask_1_38.txt, subtask_1_39.txt, subtask_1_40.txt, subtask_1_41.txt
Case Name Status Exec Time Memory
sample_01.txt AC 2 ms 4352 KB
sample_02.txt AC 2 ms 4352 KB
sample_03.txt AC 2 ms 4352 KB
subtask_1_01.txt AC 2 ms 4352 KB
subtask_1_02.txt AC 2 ms 4352 KB
subtask_1_03.txt AC 2 ms 4352 KB
subtask_1_04.txt AC 2 ms 4352 KB
subtask_1_05.txt AC 2 ms 4352 KB
subtask_1_06.txt AC 2 ms 4352 KB
subtask_1_07.txt AC 2 ms 4352 KB
subtask_1_08.txt AC 2 ms 4352 KB
subtask_1_09.txt AC 15 ms 4352 KB
subtask_1_10.txt AC 30 ms 4352 KB
subtask_1_11.txt AC 9 ms 4352 KB
subtask_1_12.txt AC 65 ms 10480 KB
subtask_1_13.txt AC 31 ms 4352 KB
subtask_1_14.txt AC 16 ms 4352 KB
subtask_1_15.txt AC 8 ms 4352 KB
subtask_1_16.txt AC 64 ms 9712 KB
subtask_1_17.txt AC 26 ms 4352 KB
subtask_1_18.txt AC 21 ms 4352 KB
subtask_1_19.txt AC 21 ms 4352 KB
subtask_1_20.txt AC 62 ms 9708 KB
subtask_1_21.txt AC 64 ms 10736 KB
subtask_1_22.txt AC 64 ms 9840 KB
subtask_1_23.txt AC 64 ms 10352 KB
subtask_1_24.txt AC 2 ms 4352 KB
subtask_1_25.txt AC 2 ms 4352 KB
subtask_1_26.txt AC 2 ms 4352 KB
subtask_1_27.txt AC 2 ms 4352 KB
subtask_1_28.txt AC 38 ms 4736 KB
subtask_1_29.txt AC 41 ms 4736 KB
subtask_1_30.txt AC 67 ms 8688 KB
subtask_1_31.txt AC 42 ms 9200 KB
subtask_1_32.txt AC 49 ms 10608 KB
subtask_1_33.txt AC 47 ms 9584 KB
subtask_1_34.txt AC 44 ms 10096 KB
subtask_1_35.txt AC 56 ms 10096 KB
subtask_1_36.txt AC 56 ms 10224 KB
subtask_1_37.txt AC 54 ms 9584 KB
subtask_1_38.txt AC 55 ms 9328 KB
subtask_1_39.txt AC 56 ms 10096 KB
subtask_1_40.txt AC 52 ms 9840 KB
subtask_1_41.txt AC 50 ms 10096 KB