結果

問題 No.608 God's Maze
ユーザー hirakich1048576hirakich1048576
提出日時 2017-12-07 00:48:46
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 4 ms / 2,000 ms
コード長 10,056 bytes
コンパイル時間 1,005 ms
コンパイル使用メモリ 35,072 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-11-29 19:19:08
合計ジャッジ時間 2,750 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,248 KB
testcase_02 AC 1 ms
5,248 KB
testcase_03 AC 1 ms
5,248 KB
testcase_04 AC 1 ms
5,248 KB
testcase_05 AC 1 ms
5,248 KB
testcase_06 AC 1 ms
5,248 KB
testcase_07 AC 1 ms
5,248 KB
testcase_08 AC 1 ms
5,248 KB
testcase_09 AC 1 ms
5,248 KB
testcase_10 AC 1 ms
5,248 KB
testcase_11 AC 1 ms
5,248 KB
testcase_12 AC 1 ms
5,248 KB
testcase_13 AC 1 ms
5,248 KB
testcase_14 AC 1 ms
5,248 KB
testcase_15 AC 1 ms
5,248 KB
testcase_16 AC 1 ms
5,248 KB
testcase_17 AC 1 ms
5,248 KB
testcase_18 AC 1 ms
5,248 KB
testcase_19 AC 1 ms
5,248 KB
testcase_20 AC 1 ms
5,248 KB
testcase_21 AC 1 ms
5,248 KB
testcase_22 AC 1 ms
5,248 KB
testcase_23 AC 1 ms
5,248 KB
testcase_24 AC 1 ms
5,248 KB
testcase_25 AC 1 ms
5,248 KB
testcase_26 AC 1 ms
5,248 KB
testcase_27 AC 1 ms
5,248 KB
testcase_28 AC 1 ms
5,248 KB
testcase_29 AC 3 ms
5,248 KB
testcase_30 AC 3 ms
5,248 KB
testcase_31 AC 2 ms
5,248 KB
testcase_32 AC 3 ms
5,248 KB
testcase_33 AC 4 ms
5,248 KB
testcase_34 AC 3 ms
5,248 KB
testcase_35 AC 1 ms
5,248 KB
testcase_36 AC 2 ms
5,248 KB
testcase_37 AC 2 ms
5,248 KB
testcase_38 AC 3 ms
5,248 KB
testcase_39 AC 2 ms
5,248 KB
testcase_40 AC 2 ms
5,248 KB
testcase_41 AC 2 ms
5,248 KB
testcase_42 AC 4 ms
5,248 KB
testcase_43 AC 2 ms
5,248 KB
testcase_44 AC 3 ms
5,248 KB
testcase_45 AC 3 ms
5,248 KB
testcase_46 AC 2 ms
5,248 KB
testcase_47 AC 1 ms
5,248 KB
testcase_48 AC 3 ms
5,248 KB
testcase_49 AC 2 ms
5,248 KB
testcase_50 AC 1 ms
5,248 KB
testcase_51 AC 1 ms
5,248 KB
testcase_52 AC 1 ms
5,248 KB
testcase_53 AC 1 ms
5,248 KB
testcase_54 AC 1 ms
5,248 KB
testcase_55 AC 1 ms
5,248 KB
testcase_56 AC 1 ms
5,248 KB
testcase_57 AC 1 ms
5,248 KB
testcase_58 AC 1 ms
5,248 KB
testcase_59 AC 1 ms
5,248 KB
testcase_60 AC 1 ms
5,248 KB
testcase_61 AC 1 ms
5,248 KB
testcase_62 AC 1 ms
5,248 KB
testcase_63 AC 1 ms
5,248 KB
testcase_64 AC 1 ms
5,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

/*
cat <<EOF >mistaken-paste
*/

#pragma GCC diagnostic ignored "-Wincompatible-pointer-types"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>

#define BIG 2000000007

#define MOD 1000000007
typedef unsigned long long ull;
typedef   signed long long sll;

#define N_MAX 100000
#define M_MAX 200

typedef struct {
	int a;
	int b;
} hw;

typedef struct {
	sll a;
	sll b;
} hwll;


typedef struct {
	ull s;
	ull t;
	int c;
} struct_a;



const hw vector8[8] = {
	{-1, -1},
	{-1,  0},
	{-1, +1},
	{ 0, -1},
	{ 0, +1},
	{+1, -1},
	{+1,  0},
	{+1, +1}
};

ull n, m;
ull h, w;
ull k;
ull vua, vub, vuc, vud, vue, vuf;
sll vsa, vsb, vsc, vsd, vse, vsf;
long double vra, vrb, vrc;
// ull a[N_MAX];
// sll a[N_MAX];
// ull a[N_MAX][N_MAX];
// ull wall[N_MAX][M_MAX];
// ull b[N_MAX];
// sll b[N_MAX];
// ull b[N_MAX][N_MAX];
// sll b[N_MAX][N_MAX];
char s[N_MAX + 1];
// char t[N_MAX + 1];
size_t slen;
// size_t tlen;
// char s[N_MAX][M_MAX + 1];

// ull dp[N_MAX];
// sll dp[N_MAX];
bool dp[N_MAX];
// ull dq[N_MAX];
// ull dp[N_MAX + 1][N_MAX + 1];
// ull dp[N_MAX][M_MAX + 1];

// hw arr[N_MAX];
// hwll arr[N_MAX];
// hw brr[M_MAX];

// ull bitdp[1 << N_MAX];

// ull digitdp[102][   2][    2];
//          pos  less  carry


// struct_a arr[N_MAX * 2];
// struct_b brr[N_MAX * 2];

void swap_adj (ull *a, ull *b) {
	ull tmp = *b;
	*b = *a;
	*a = tmp;
	return;
}

ull divide (ull a, ull b) {
	ull x = MOD - 2;
	ull ans = 1;
	while (x) {
		if (x & 1) ans = (ans * b) % MOD;
		b = (b * b) % MOD;
		x /= 2;
	}
	return (a * ans) % MOD;
}

int digits (ull x) {
	int i = 1;
	while (x >= 10) {
		x /= 10;
		i++;
	}
	return i;
}

ull umin (ull x, ull y) {
	return (x < y) ? x : y;
}

ull umax (ull x, ull y) {
	return (x > y) ? x : y;
}

sll smin (sll x, sll y) {
	return (x < y) ? x : y;
}

sll smax (sll x, sll y) {
	return (x > y) ? x : y;
}

ull gcd (ull x, ull y) {
	if (x < y) {
		return gcd(y, x);
	} else if (y == 0) {
		return x;
	} else {
		return gcd(y, x % y);
	}
}

ull bitpow (ull a, ull x, ull modulo) {
	ull result = 1;
	while (x) {
		if (x & 1) {
			result *= a;
			result %= modulo;
		}
		x /= 2;
		a = (a * a) % modulo;
	}
	return result;
}

// int nextroute (int arr[]) {
// 	int i = n - 1;
// 	int j, x;
// 	while (arr[i - 1] > arr[i]) i--;

// 	x = n;
// 	for (j = i; j < n; j++) {
// 		if (arr[j] < arr[i - 1]) continue;
// 		if (x == n || arr[x] > arr[j]) x = j;
// 	}
// 	arr[i - 1] ^= arr[x];
// 	arr[x] ^= arr[i - 1];
// 	arr[i - 1] ^= arr[x];

// 	qsort(&arr[i], n - i, sizeof(int), comp);
// 	return 0;
// }

int targetdig (ull x, int index /* 1-indexed */) {
	// static...?
	int posmax = digits(x);
	if (posmax < index) return -1;
	while (posmax > index) {
		posmax--;
		x /= 10;
	}
	return x % 10;
}

int charcomp (const char left, const char right) {
	if (left < right) {
		return -1;
	} else if (left > right) {
		return +1;
	} else {
		return 0;
	}
}

int pcharcomp (const char *left, const char *right) {
	return charcomp(*left, *right);
}

int intcomp (const int left, const int right) {
	if (left < right) {
		return -1;
	} else if (left > right) {
		return +1;
	} else {
		return 0;
	}
}

int pintcomp (const int *left, const int *right) {
	return intcomp(*left, *right);
}

int ullcomp (const ull left, const ull right) {
	if (left < right) {
		return -1;
	} else if (left > right) {
		return +1;
	} else {
		return 0;
	}
}

int pullcomp (const ull *left, const ull *right) {
	return ullcomp(*left, *right);
}

int sllcomp (const sll left, const sll right) {
	if (left < right) {
		return -1;
	} else if (left > right) {
		return +1;
	} else {
		return 0;
	}
}

int psllcomp (const sll *left, const sll *right) {
	return sllcomp(*left, *right);
}

int phwAcomp (const hw *left, const hw *right) {
	return intcomp(left->a, right->a);
}

int phwBcomp (const hw *left, const hw *right) {
	return intcomp(left->b, right->b);
}

int phwABcomp (const hw *left, const hw *right) {
	int x = phwAcomp(left, right);
	if (x) return x;
	return phwBcomp(left, right);
}

int phwllAcomp (const hwll *left, const hwll *right) {
	return sllcomp(left->a, right->a);
}

int phwllBcomp (const hwll *left, const hwll *right) {
	return sllcomp(left->b, right->b);
}

int phwllABcomp (const hwll *left, const hwll *right) {
	int x = phwllAcomp(left, right);
	if (x) return x;
	return phwllBcomp(left, right);
}

int pstrAcomp (const struct_a *left, const struct_a *right) {
	int x;
	if (x = ullcomp(left->t, right->t)) return x;
	if (x = ullcomp(left->s, right->s)) return x;
	if (x = intcomp(left->c, right->c)) return x;
	return 0;
}

int bitlet (char c) {
	return (1 << (c - 'a'));
}

ull ullabs (ull a, ull b) {
	if (a >= b) {
		return a - b;
	} else {
		return b - a;
	}
}

sll sllabs (sll a, sll b) {
	if (a >= b) {
		return a - b;
	} else {
		return b - a;
	}
}

sll nibutanlobo (bool (*func)(sll arg), sll ok, sll ng) {
	while (sllabs(ok, ng) > 1) {
		sll med = (ok + ng) / 2;
		if (func(med)) {
			ok = med;
		} else {
			ng = med;
		}

		// printf("debug: [%lld %lld)\n", ok, ng);
	}

	if (!func(ok)) return ok * 2 - ng;
	return ok;
}


ull accumu[N_MAX];
ull accumu_sum (int left, int right) {
	return accumu[right] - (left ? accumu[left - 1] : 0);
}

ull solve () {
	sll i, j, ki;
	ull result = BIG;
	// sll result;
	ull sum = 0;
	// qsortの際には"p"ullcompを使う

	for (i = 0; i < slen; i++) {
		ull item = ((s[i] == '#') ? 1 : 0);
		if (i == 0) {
			accumu[i] = item;
		} else {
			accumu[i] = accumu[i - 1] + item;
		}
	}

	n--;

	if (accumu_sum(0, slen - 1) == 1 && accumu[n] == 1 && (n == 0 || accumu[n - 1] == 0)) {
		puts("3");
		return 0;
	}

	result = BIG;
	// goal stands left
	if (n > 0) {
		ull goal;
		ull repeatpath = 0;
		
		ull tilesum = (n - accumu_sum(0, n - 1)) + accumu_sum(n, slen - 1);

		// for (i = 0; i < slen; i++) {
		// 	printf("%llu ", accumu[i]);
		// }
		// puts("");
		// printf("%llu\n", tilesum);

		for (goal = 0; goal <= n; goal++) {
			if (s[goal] == '#') break;
			tilesum--;
		}
		if (tilesum % 2 == 1) {
			goal++;
		}

		// printf("LEFT GOAL: %llu\n", goal);

		if (goal <= n) {
			for (i = 0; i < slen; i++) {
				dp[i] = ((s[i] == '#') ? true : false);
				if (goal <= i && i <= n - 1) {
					dp[i] = !dp[i];
				}
				// putchar(dp[i] ? '#' : '.');
			}
			// puts("");

			sll pairleft, pairright;
			sll rightest = n;

			// for (pairright = slen - 1; pairright > rightest; pairright--) {
			// 	if (dp[pairright]) break;
			// }
			// if (pairright > rightest) {

			// 	pairleft = rightest;
			// 	while (pairleft >= 0 && !dp[pairleft]) pairleft--;

			// 	if (pairleft >= 0) {
			// 		dp[pairleft] = dp[pairright] = false;
			// 		repeatpath += (pairright - pairleft);

			// 		rightest = pairright;

			// 		// printf(":!: %lld,%lld\n", pairleft, pairright);

			// 	}
			// }

			// printf("pr(%lld) - pl(%lld): %lld\n", pairright, pairleft, repeatpath);

			pairleft = slen;
			pairright = slen + 1;
			for (i = slen - 1; i >= 0; i--) {
				if (!dp[i]) continue;

				if (pairleft < pairright) {
					if (pairleft < slen && pairleft > rightest) {
						repeatpath += (pairleft - smax(i, rightest)) * 2;
						// printf("%lld~%lld\n", smax(i, rightest), pairleft);
					}

					pairright = i;
				} else {
					repeatpath += (pairright - i);
					pairleft = i;
				}

				// printf("%lld:: %llu (pl: %lld pr: %lld)\n", i, repeatpath, pairleft, pairright);
			}
			if (pairleft < slen && pairleft > rightest) {
				repeatpath += (pairleft - rightest) * 2;
			}

			// printf("(%lld - %lld) + %lld * 2\n", n, goal, repeatpath);

			ull maybe = (n - goal) + repeatpath * 2;
			if (result > maybe) result = maybe;
		}
	}

	// goal stands right
	if (n < slen - 1) {
		ull goal;
		ull repeatpath = 0;
		
		ull tilesum = accumu_sum(0, n) + ((slen - n - 1) - accumu_sum(n + 1, slen - 1));

		for (goal = slen - 1; goal >= n; goal--) {
			if (s[goal] == '#') break;
			tilesum--;
		}
		if (tilesum % 2 == 1) {
			goal--;
		}

		if (goal >= n) {
			for (i = 0; i < slen; i++) {
				dp[i] = ((s[i] == '#') ? true : false);
				if (n + 1 <= i && i <= goal) {
					dp[i] = !dp[i];
				}
			}

			sll pairleft, pairright;
			sll leftest = n;

			// for (pairleft = 0; pairleft > leftest; pairleft++) {
			// 	if (dp[pairleft]) break;
			// }
			// if (pairleft > leftest) {

			// 	pairright = leftest;
			// 	while (pairright < slen && !dp[pairright]) pairright++;

			// 	if (pairright < slen) {
			// 		dp[pairleft] = dp[pairright] = false;
			// 		repeatpath += (pairright - pairleft);

			// 		leftest = pairleft;
			// 	}
			// }

			pairleft = -2;
			pairright = -1;
			for (i = 0; i < slen; i++) {
				if (!dp[i]) continue;

				if (pairleft < pairright) {
					if (pairright >= 0 && pairright < leftest) {
						repeatpath += (smin(i, leftest) - pairright) * 2;
						// printf("%lld~%lld\n", pairright, smax(i, leftest));
					}

					pairleft = i;
				} else {
					repeatpath += (i - pairleft);
					pairright = i;
				}

				// printf("%lld:: %llu (pl: %lld pr: %lld)\n", i, repeatpath, pairleft, pairright);

			}

			// printf("(%lld - %lld) + %lld * 2\n", n, goal, repeatpath);


			if (pairright >= 0 && pairright < leftest) {
				repeatpath += (leftest - pairright) * 2;
			}

			ull maybe = (goal - n) + repeatpath * 2;
			if (result > maybe) result = maybe;
		}
	}

	printf("%llu\n", result);
	// puts(s);

	return 0;

	success:
	puts("Yes");
	// printf("%llu\n", result);
	return 0;

	fail:
	puts("No");
	return 1;
}

int main (void) {
	int i, j;
	int x, y;

	// scanf("%llu%llu", &h, &w);
	scanf("%llu", &n, &k);
	// scanf("%llu%llu", &vua, &vub);
	scanf("%s", s);
	slen = strlen(s);
	// scanf("%s", t);
	// tlen = strlen(t);
	// scanf("%llu", &k);
	// for (i = 0; i < n; i++) {
	// 	scanf("%llu", &a[i]);
	// }
	// for (i = 0; i < m; i++) {
	// 	scanf("%lld", &b[i]);
	// }
	// for (i = 0; i < n; i++) {
	// 	scanf("%llu%llu%d", &arr[i].s, &arr[i].t, &arr[i].c);
	// 	arr[i].c--;
	// }

	solve();

	// for (i = 0; i < n; i++) {
	// 	// scanf("%llu%llu", &vua, &vub);
	// 	scanf("%s", s);
	// 	solve();
	// }

	return 0;
}
0