답안 #67592

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
67592 2018-08-15T05:09:59 Z Crown 웜뱃 (IOI13_wombats) C++14
55 / 100
20000 ms 263168 KB
#include "wombats.h"
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define pb push_back
typedef pair<int, int> ii;
typedef long long ll;

int n, m;
const int maxn = 5005;
const int maxm = 205;
int H[maxn][maxm], V[maxn][maxm];

struct node
{
	vector< vector<int> > dist;
	node(){}
	node(bool create)
	{
		if(create)
		{
			dist.assign(m, vector<int>(m, 1e9));
			for(int i = 0; i< m; i++) dist[i][i] = 0;
		}
	}
};

node st[4*maxn];

const int ub = 7;

void dijk(int s, int r1, int r2, vector<int> &dist)
{
	vector<vector<int> > tod(r2-r1+1, vector<int>(m, 1e9));
	tod[0][s] = 0;
	priority_queue< pair<int, ii> > pq;
	pq.push(make_pair(0, ii(r1, s)));
	while(!pq.empty())
	{
		auto f = pq.top(); pq.pop();
		int d = -f.X, x = f.Y.X, y = f.Y.Y;
		if(d> tod[x-r1][y]) continue;
		if(y && H[x][y-1]+d< tod[x-r1][y-1])
		{
			tod[x-r1][y-1] = H[x][y-1]+d;
			pq.push(make_pair(-tod[x-r1][y-1], ii(x, y-1)));
		}
		if(y+1< m && H[x][y]+d< tod[x-r1][y+1])
		{
			tod[x-r1][y+1] = H[x][y]+d;
			pq.push(make_pair(-tod[x-r1][y+1], ii(x, y+1)));
		}
		if(x+1<= r2 && V[x][y]+d< tod[x+1-r1][y])
		{
			tod[x+1-r1][y] = V[x][y]+d;
			pq.push(make_pair(-tod[x+1-r1][y], ii(x+1, y)));
		}
	}
	dist = tod.back();
}

void merge(vector< vector<int> > &dist, vector< vector<int> > &d1, vector< vector<int> > &d2)
{
	// printf("begun merging\n");
	vector< vector<int> > opt(m, vector<int>(m, 0));
	for(int diff = -m+1; diff<= m-1; diff++)
	{
		for(int i = 0; i< m; i++)
		{
			int j = i+diff;
			if(j< 0 || j>= m) continue;
			// printf("begun %d %d\n", i, j);
			dist[i][j] = 1e9;
			if(diff == -m+1)
			{
				for(int k = 0; k< m; k++)
				{
					if(d1[i][k]+d2[k][j]< dist[i][j])
					{
						dist[i][j] = d1[i][k] + d2[k][j];
						opt[i][j] = k;
					}
				}
			}
			else
			{
				for(int k = max(0, j?opt[i][j-1]:0); k<= min(m-1, i+1< m?opt[i+1][j]:m-1); k++)
				{
					//printf("k = %d\n", k);
					if(d1[i][k]+d2[k][j]< dist[i][j])
					{
						dist[i][j] = d1[i][k] + d2[k][j];
						opt[i][j] = k;
					}
				}
			}
		}
	}
	// printf("finished merging\n");
}

void build(int p = 1, int L = 0, int R = n-1)
{
	// printf("%d %d %d\n", p, L, R);
	st[p] = node(true);
	if(R-L+1<= ub)
	{
		for(int i = 0; i< m; i++)
		{
			dijk(i, L, R, st[p].dist[i]);
		}
		// printf("finished creating\n");
		return;
	}
	build(2*p, L, (L+R)/2);
	build(2*p+1, (L+R)/2, R);
	merge(st[p].dist, st[2*p].dist, st[2*p+1].dist);
}

void update(int x, int p = 1, int L = 0, int R = n-1)
{
	if(R-L+1<= ub)
	{
		for(int i = 0; i< m; i++)
		{
			dijk(i, L, R, st[p].dist[i]);
		}
		return;
	}

	int M = (L+R)/2;
	if(x<= M) update(x, 2*p, L, (L+R)/2);
	if(M<= x) update(x, 2*p+1, (L+R)/2, R);
	merge(st[p].dist, st[2*p].dist, st[2*p+1].dist);
}

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+1< m; j++)
		{
			H[i][j] = h[i][j];
		}
	}
	for(int i = 0; i+1< n; i++)
	{
		for(int j = 0; j< m; j++)
		{
			V[i][j] = v[i][j];
		}
	}
	//printf("started initing\n");
	build();
}

void changeH(int P, int Q, int W)
{
	//printf("changingH\n");
	H[P][Q] = W;
	update(P);
}

void changeV(int P, int Q, int W)
{
	//printf("changingV\n");
	V[P][Q] = W;
	update(P);
}

int escape(int V1, int V2)
{
	return st[1].dist[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 13 ms 8824 KB Output is correct
2 Correct 12 ms 8952 KB Output is correct
3 Correct 122 ms 10940 KB Output is correct
4 Correct 16 ms 10940 KB Output is correct
5 Correct 13 ms 10940 KB Output is correct
6 Correct 3 ms 10940 KB Output is correct
7 Correct 4 ms 10940 KB Output is correct
8 Correct 2 ms 10940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 10940 KB Output is correct
2 Correct 4 ms 10940 KB Output is correct
3 Correct 3 ms 10940 KB Output is correct
4 Correct 6 ms 10940 KB Output is correct
5 Correct 4 ms 10940 KB Output is correct
6 Correct 4 ms 10940 KB Output is correct
7 Correct 5 ms 10940 KB Output is correct
8 Correct 4 ms 10940 KB Output is correct
9 Correct 4 ms 10940 KB Output is correct
10 Correct 5 ms 10940 KB Output is correct
11 Correct 101 ms 10940 KB Output is correct
12 Correct 4 ms 10940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 832 ms 10940 KB Output is correct
2 Correct 1784 ms 10940 KB Output is correct
3 Correct 965 ms 10940 KB Output is correct
4 Correct 909 ms 10940 KB Output is correct
5 Correct 947 ms 10940 KB Output is correct
6 Correct 2 ms 10940 KB Output is correct
7 Correct 2 ms 10940 KB Output is correct
8 Correct 2 ms 10940 KB Output is correct
9 Correct 8728 ms 10940 KB Output is correct
10 Correct 3 ms 10940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 17952 KB Output is correct
2 Correct 23 ms 17952 KB Output is correct
3 Correct 28 ms 17952 KB Output is correct
4 Correct 59 ms 18680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 838 ms 18680 KB Output is correct
2 Correct 1794 ms 18680 KB Output is correct
3 Correct 1037 ms 18680 KB Output is correct
4 Correct 981 ms 18680 KB Output is correct
5 Correct 1053 ms 18680 KB Output is correct
6 Correct 27 ms 18680 KB Output is correct
7 Correct 25 ms 18680 KB Output is correct
8 Correct 25 ms 18680 KB Output is correct
9 Correct 68 ms 18772 KB Output is correct
10 Correct 12 ms 18772 KB Output is correct
11 Correct 16 ms 18772 KB Output is correct
12 Correct 87 ms 18772 KB Output is correct
13 Correct 13 ms 18772 KB Output is correct
14 Correct 14 ms 18772 KB Output is correct
15 Correct 3 ms 18772 KB Output is correct
16 Correct 3 ms 18772 KB Output is correct
17 Correct 2 ms 18772 KB Output is correct
18 Correct 6 ms 18772 KB Output is correct
19 Correct 4 ms 18772 KB Output is correct
20 Correct 5 ms 18772 KB Output is correct
21 Correct 5 ms 18772 KB Output is correct
22 Correct 4 ms 18772 KB Output is correct
23 Correct 4 ms 18772 KB Output is correct
24 Correct 5 ms 18772 KB Output is correct
25 Correct 97 ms 18772 KB Output is correct
26 Correct 4 ms 18772 KB Output is correct
27 Correct 8510 ms 18772 KB Output is correct
28 Correct 18988 ms 106540 KB Output is correct
29 Correct 8548 ms 107292 KB Output is correct
30 Correct 7701 ms 110600 KB Output is correct
31 Execution timed out 20061 ms 118232 KB Time limit exceeded
32 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 777 ms 118232 KB Output is correct
2 Correct 1726 ms 118232 KB Output is correct
3 Correct 1016 ms 118232 KB Output is correct
4 Correct 848 ms 118232 KB Output is correct
5 Correct 915 ms 118232 KB Output is correct
6 Correct 21 ms 118232 KB Output is correct
7 Correct 22 ms 118232 KB Output is correct
8 Correct 22 ms 118232 KB Output is correct
9 Correct 61 ms 118232 KB Output is correct
10 Correct 10 ms 118232 KB Output is correct
11 Correct 13 ms 118232 KB Output is correct
12 Correct 83 ms 118232 KB Output is correct
13 Correct 12 ms 118232 KB Output is correct
14 Correct 15 ms 118232 KB Output is correct
15 Runtime error 13271 ms 263168 KB Memory limit exceeded: We have a known bug that the memory usage is measured incorrectly (possibly because of Meltdown/Spectre patch), so your solution may be correct. Please submit again. Sorry for the inconvenience.
16 Halted 0 ms 0 KB -