Submission #41734

#TimeUsernameProblemLanguageResultExecution timeMemory
41734festGolf (JOI17_golf)C++14
30 / 100
2850 ms167412 KiB
// fest
#include <bits/stdc++.h>	

#define pb push_back
#define F first
#define S second
#define y1 dasdasfasfas
#define x1 wqdadfasfasfas
#define All(c) c.begin(), c.end()
#define SZ(A) (int((A).size()))
#define umap unordered_map
#define FILENAME ""
#define __ fflush(stdout)

typedef long long ll;
typedef long double ld;    

using namespace std;

void FREOPEN() {
	#ifdef COMP
		freopen(".in", "r", stdin);
		freopen("1.out", "w", stdout);
	#else
		freopen(FILENAME".in", "r", stdin);
		freopen(FILENAME".out", "w", stdout);
	#endif
}                           

inline double Time() {return (clock() * 1.0) / CLOCKS_PER_SEC; }             

const int N = 1111, inf = 1e9 + 1, MOD = (int)1e9 + 7;

char CH[N];

const ll INF = 1e18;

const int dx[] = {1, -1, 0, 0, -1, 1, -1, 1};
const int dy[] = {0, 0, 1, -1, -1, 1, 1, -1};

int x1[N], x2[N], y1[N], y2[N], dp[N + N][N + N][4];

bool no[N + N][N + N][4];

int pos(const vector<int> &all, int x) {
	return lower_bound(All(all), x) - all.begin();
}

int main() {
  
	vector<int> all_x, all_y;
	int st[2], fi[2];
	cin >> st[0] >> st[1] >> fi[0] >> fi[1];
	all_x.pb(0);
	all_y.pb(0);
	all_x.pb(st[0]);
	all_x.pb(fi[0]);
	all_y.pb(st[1]);
	all_y.pb(fi[1]);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		scanf("%d %d %d %d", x1 + i, x2 + i, y1 + i, y2 + i);
		all_x.pb(x1[i]), all_x.pb(x2[i]);
		all_y.pb(y1[i]), all_y.pb(y2[i]);
	}
	sort(All(all_x)), all_x.resize(unique(All(all_x)) - all_x.begin());
	sort(All(all_y)), all_y.resize(unique(All(all_y)) - all_y.begin());
	st[0] = pos(all_x, st[0]);
	st[1] = pos(all_y, st[1]);
	fi[0] = pos(all_x, fi[0]);
	fi[1] = pos(all_y, fi[1]);
	for (int i = 1; i <= n; i++) {
		x1[i] = pos(all_x, x1[i]);
		x2[i] = pos(all_x, x2[i]);
		y1[i] = pos(all_y, y1[i]);
		y2[i] = pos(all_y, y2[i]);
		for (int x = x1[i] + 1; x < x2[i]; x++) no[x][y1[i]][2] = no[x][y2[i]][3] = 1;
		for (int y = y1[i] + 1; y < y2[i]; y++) no[x1[i]][y][0] = no[x2[i]][y][1] = 1;
	}
	int mx = SZ(all_x), my = SZ(all_y);
	for (int i = 0; i < mx; i++) for (int j = 0; j < my; j++) for (int dir = 0; dir < 4; dir++) dp[i][j][dir] = inf;
	set<pair<int, pair<int, pair<int, int> > > > s;
	for (int dir = 0; dir < 4; dir++) dp[st[0]][st[1]][dir] = 1, s.insert({1, {st[0], {st[1], dir}}});
	while (!s.empty()) {
		int x = s.begin() -> S.F;
		int y = s.begin() -> S.S.F;
		int dir = s.begin() -> S.S.S;
		s.erase(s.begin());
		for (int dir2 = 0; dir2 < 4; dir2++) {
			if (no[x][y][dir2]) continue;
			int ux = x + dx[dir2], uy = y + dy[dir2];
			if (ux == 0 || uy == 0 || ux >= mx || uy >= my) continue;
			if (dp[ux][uy][dir2] > dp[x][y][dir] + (dir != dir2)) {
				s.erase({dp[ux][uy][dir2], {ux, {uy, dir2}}});
				dp[ux][uy][dir2] = dp[x][y][dir] + (dir != dir2);
				s.insert({dp[ux][uy][dir2], {ux, {uy, dir2}}});
			}
		}
		for (int dir2 = 0; dir2 < 4; dir2++) {
			if (no[x][y][dir2]) continue;
			if (dp[x][y][dir2] > dp[x][y][dir] + (dir != dir2)) {
				s.erase({dp[x][y][dir2], {x, {y, dir2}}});
				dp[x][y][dir2] = dp[x][y][dir] + (dir != dir2);
				s.insert({dp[x][y][dir2], {x, {y, dir2}}});
			}	
		}
	}
	int ans = inf;
	for (int dir = 0; dir < 4; dir++) ans = min(ans, dp[fi[0]][fi[1]][dir]);
	cout << ans;
	return 0;	
}

Compilation message (stderr)

golf.cpp: In function 'void FREOPEN()':
golf.cpp:25:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(FILENAME".in", "r", stdin);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
golf.cpp:26:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(FILENAME".out", "w", stdout);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
golf.cpp: In function 'int main()':
golf.cpp:63:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d %d", x1 + i, x2 + i, y1 + i, y2 + i);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...