답안 #67590

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
67590 2018-08-15T05:05:39 Z Crown 웜뱃 (IOI13_wombats) C++14
0 / 100
1842 ms 16856 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 = 15;

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 Incorrect 13 ms 8696 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 8696 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1794 ms 8696 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 24 ms 16856 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1785 ms 16856 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1842 ms 16856 KB Output isn't correct
2 Halted 0 ms 0 KB -