답안 #52008

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
52008 2018-06-23T08:28:01 Z radoslav11 웜뱃 (IOI13_wombats) C++14
37 / 100
7351 ms 103980 KB
#include <bits/stdc++.h>
#include "wombats.h"
//#include "Lgrader.cpp"

using namespace std;
template<class T, class T2> inline int chkmax(T &x, const T2 &y) { return x < y ? x = y, 1 : 0; }
template<class T, class T2> inline int chkmin(T &x, const T2 &y) { return x > y ? x = y, 1 : 0; }
const int MAXN = 5002;
const int MAXM = 205;
const int B = 20;
const int inf = (int)1e9;

using matrix = array<array<int, MAXM>, MAXM>;

int n, m;
int H[MAXN + 42][MAXM + 42];
int V[MAXN + 42][MAXM + 42];
matrix tmp;
matrix dist[B + 3];
bool in_queue[MAXM][B + 3];

matrix bfs_brute(int l, int r)
{
	for(int ll = 0; ll < (r - l + 1); ll++)
		for(int i = 0; i < m; i++)
			for(int j = 0; j < m; j++)
				dist[ll][i][j] = inf;
	
	for(int st = 0; st < m; st++)
	{
		for(int i = 0; i < m; i++)
			for(int ll = 0; ll < (r - l + 1); ll++)
				in_queue[i][ll] = false;

		queue<pair<int, int> > Q;
		Q.push({st, 0});
		dist[0][st][st] = 0;
		in_queue[st][0] = true;

		while(!Q.empty())
		{
			int pos = Q.front().first, ll = Q.front().second;
			Q.pop(), in_queue[pos][ll] = false;
			
			if(pos && chkmin(dist[ll][st][pos - 1], dist[ll][st][pos] + H[ll + l][pos - 1]) && !in_queue[pos - 1][ll]) Q.push({pos - 1, ll}), in_queue[pos - 1][ll] = true; 
			if(pos < m - 1 && chkmin(dist[ll][st][pos + 1], dist[ll][st][pos] + H[ll + l][pos]) && !in_queue[pos + 1][ll]) Q.push({pos + 1, ll}), in_queue[pos + 1][ll] = true; 
			if(ll + l < r && chkmin(dist[ll + 1][st][pos], dist[ll][st][pos] + V[ll + l][pos]) && !in_queue[pos][ll + 1]) 
				Q.push({pos, ll + 1}), in_queue[pos][ll + 1] = true; 
		}
	}

	return dist[r - l];
}

int opt[MAXM][MAXN];

matrix merge(const matrix &f, const matrix &s)
{
	for(int i = 0; i < m; i++)
		for(int j = 0; j < m; j++)
			tmp[i][j] = inf;

	for(int j = 0; j < m; j++)
		for(int c = 0; c < m; c++)
			if(chkmin(tmp[0][j], f[0][c] + s[c][j]))
				opt[0][j] = c;

	for(int i = 1; i < m; i++)
	{
		opt[i][m] = m - 1;
		for(int j = m - 1; j >= 0; j--)
			for(int c = opt[i][j + 1]; c >= opt[i - 1][j]; c--)
				if(chkmin(tmp[i][j], f[i][c] + s[c][j]))
					opt[i][j] = c;
	}

	return tmp;
}

matrix tr[MAXN * 8 / B + 42];

void init(int l, int r, int idx)
{
	if(r - l <= B)
	{
		tr[idx] = bfs_brute(l, r + 1);
		return;
	}

	int mid = (l + r) >> 1;
	init(l, mid, 2 * idx + 1);
	init(mid + 1, r, 2 * idx + 2);
	tr[idx] = merge(tr[2 * idx + 1], tr[2 * idx + 2]);
}

void recalc(int p, int l, int r, int idx)
{
	if(r - l <= B)
	{
		tr[idx] = bfs_brute(l, r + 1);
		return;
	}

	int mid = (l + r) >> 1;
	if(p <= mid) recalc(p, l, mid, 2 * idx + 1);
	else recalc(p, mid + 1, r, 2 * idx + 2);
	tr[idx] = merge(tr[2 * idx + 1], tr[2 * idx + 2]);
}

void init(int R, int C, int H[5000][200], int V[5000][200]) 
{
    n = R, m = C;
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m - 1; j++)
			::H[i][j] = H[i][j];

	for(int i = 0; i < n - 1; i++)
		for(int j = 0; j < m; j++)
			::V[i][j] = V[i][j];

	for(int i = 0; i < m - 1; i++) ::H[n][i] = inf;

	init(0, n - 1, 0);
}

void changeH(int P, int Q, int W) 
{
    H[P][Q] = W;
	recalc(P, 0, n - 1, 0);
	//init(0, n - 1, 0);
}

void changeV(int P, int Q, int W) 
{
    V[P][Q] = W;
	recalc(P, 0, n - 1, 0);
	//init(0, n - 1, 0);
}

int escape(int V1, int V2) 
{ 
	return tr[0][V1][V2]; 
}

Compilation message

grader.c: In function 'int main()':
grader.c:15:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
  int res;
      ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 243 ms 94676 KB Output is correct
2 Correct 233 ms 94824 KB Output is correct
3 Correct 295 ms 96284 KB Output is correct
4 Correct 237 ms 96284 KB Output is correct
5 Correct 234 ms 96284 KB Output is correct
6 Correct 4 ms 96284 KB Output is correct
7 Correct 2 ms 96284 KB Output is correct
8 Correct 2 ms 96284 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 96284 KB Output is correct
2 Correct 3 ms 96284 KB Output is correct
3 Correct 2 ms 96284 KB Output is correct
4 Correct 3 ms 96284 KB Output is correct
5 Correct 3 ms 96284 KB Output is correct
6 Correct 3 ms 96284 KB Output is correct
7 Correct 4 ms 96284 KB Output is correct
8 Correct 3 ms 96284 KB Output is correct
9 Correct 4 ms 96284 KB Output is correct
10 Correct 3 ms 96284 KB Output is correct
11 Correct 148 ms 96284 KB Output is correct
12 Correct 8 ms 96284 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 412 ms 96284 KB Output is correct
2 Correct 1797 ms 96284 KB Output is correct
3 Correct 511 ms 96284 KB Output is correct
4 Correct 512 ms 96284 KB Output is correct
5 Correct 455 ms 96284 KB Output is correct
6 Correct 4 ms 96284 KB Output is correct
7 Correct 3 ms 96284 KB Output is correct
8 Correct 2 ms 96284 KB Output is correct
9 Correct 7351 ms 96284 KB Output is correct
10 Correct 2 ms 96284 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 277 ms 103868 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 437 ms 103868 KB Output is correct
2 Correct 1737 ms 103868 KB Output is correct
3 Correct 472 ms 103868 KB Output is correct
4 Correct 433 ms 103868 KB Output is correct
5 Correct 455 ms 103868 KB Output is correct
6 Incorrect 238 ms 103980 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 418 ms 103980 KB Output is correct
2 Correct 1732 ms 103980 KB Output is correct
3 Correct 446 ms 103980 KB Output is correct
4 Correct 525 ms 103980 KB Output is correct
5 Correct 417 ms 103980 KB Output is correct
6 Incorrect 232 ms 103980 KB Output isn't correct
7 Halted 0 ms 0 KB -