답안 #374031

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
374031 2021-03-06T13:12:39 Z MetB 웜뱃 (IOI13_wombats) C++14
55 / 100
6416 ms 262148 KB
#include "wombats.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
 
using namespace __gnu_pbds;
 
using namespace std;
 
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
 
const ll N = 2000001;
const ll INF = 1e18, MOD = 1e9 + 7, MOD2 = 1e6 + 3;

int R, C, hor[5000][200], ver[5000][200];

struct cut {
	vector<vector<ll>> d;

	cut() {
		for (int i = 0; i < C; i++)
			d.push_back(vector<ll>(C, INF));
	}

	cut(int pos) {
		d = vector<vector<ll>>(C);
		
		for (int i = 0; i < C; i++)
			d[i] = vector<ll>(C, INF);

		for (int i = 0; i < C; i++)
			d[i][i] = 0;

		if (R <= pos) return;

		for (int i = 0; i < C; i++) {
			for (int j = i + 1; j < C; j++) {
				d[i][j] = d[j][i] = d[i][j-1] + hor[pos][j-1];
			}
		}

		/*cout << "Create on " << pos << endl;

		for (int i = 0; i < C; i++) {
			for (int j = 0; j < C; j++) {
				cout << d[i][j] << ' ';
			}
			cout << endl;
		}*/
	}

	vector<ll>& operator[](int x) {
		return d[x];
	}
};

cut merge(cut dl, cut dr, int pos) {
	cut d;

	vector<int> opt(C, -1), optr(C, -1);

	for (int i = 0; i < C; i++) {
		for (int j = 0; j < C; j++) {
			if (d[i][i] > dl[i][j] + ver[pos][j] + dr[j][i]) {
				optr[i] = opt[i] = j; 
				d[i][i] = dl[i][j] + ver[pos][j] + dr[j][i];
			}
		}
	}

	for (int k = 1; k < C; k++) {

		for (int i = 0; i + k < C; i++) {
			for (int j = opt[i]; j <= opt[i+1]; j++) {
				if (d[i][i+k] > dl[i][j] + ver[pos][j] + dr[j][i+k]) {
					opt[i] = j; 
					d[i][i+k] = dl[i][j] + ver[pos][j] + dr[j][i+k];
				}
			}
		}

		for (int i = C - k - 1; i >= 0; i--) {
			int r = optr[i+k];
			for (int j = optr[i+k-1]; j <= r; j++) {
				if (d[i+k][i] > dl[i+k][j] + ver[pos][j] + dr[j][i]) {
					optr[i+k] = j; 
					d[i+k][i] = dl[i+k][j] + ver[pos][j] + dr[j][i];
				}
			}
		}
	}

	/*for (int i = 0; i < C; i++) {
		for (int j = 0; j < C; j++) {
			for (int k = 0; k < C; k++) {
				d[i][j] = min(d[i][j], dl[i][k] + ver[pos][k] + dr[k][j]);
			}
		}
	}*/

	/*cout << "Merge on " << pos << endl;

	for (int i = 0; i < C; i++) {
		cout << ver[pos][i] << endl;
	}

	for (int i = 0; i < C; i++) {
		for (int j = 0; j < C; j++) {
			cout << d[i][j] << ' ';
		}
		cout << endl;
	}*/

	return d;
}

struct DynamicGrid {
	int start;
	vector<cut> t;

	void build() {
		start = 1;
		while (start < R) start <<= 1;
		t.resize(2 * start);

		t[1] = cut(0);

		for (int i = 1; i < R; i++) {
			t[1] = merge(t[1], cut(i), i - 1);
		}
		
		//build(1, 0, start - 1, R);
	}

	void build(int node, int tl, int tr, int sz) {
		if (tl == tr) {
			t[node] = cut(tl);
			return;
		}

		int tm = (tl + tr) / 2;

		build(2 * node, tl, tm, sz);
		build(2 * node + 1, tm + 1, tr, sz);

		t[node] = merge(t[2 * node], t[2 * node + 1], tm);
	}

	void update(int x) {
		t[1] = cut(0);
		for (int i = 1; i < R; i++) {
			t[1] = merge(t[1], cut(i), i - 1);
		}
		//update(1, 0, start - 1, x);
	}

	void update(int node, int tl, int tr, int x) {
		if (x < tl || tr < x) return;

		if (tl == tr) {
			assert(tl == x);
			t[node] = cut(x);
			return;
		} 

		int tm = (tl + tr) / 2;

		if (x <= tm) update(2 * node, tl, tm, x);
		else update(2 * node + 1, tm + 1, tr, x);

		t[node] = merge(t[2 * node], t[2 * node + 1], tm);
	}

	int get(int a, int b) {
		//cout << "Get " << t[1][a][b] << endl;
		return t[1][a][b];
	}
} t;

void init(int r, int c, int H[5000][200], int V[5000][200]) {
	R = r, C = c;

	for (int i = 0; i < R; i++)
		for (int j = 0; j < C; j++) {
			hor[i][j] = H[i][j];
			ver[i][j] = V[i][j];
		}

	t.build();
}

void changeH(int P, int Q, int W) {
	hor[P][Q] = W;

	t.update(P);
}

void changeV(int P, int Q, int W) {
	ver[P][Q] = W;
	t.update(P);
}

int escape(int V1, int V2) {
	return t.get(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]
   15 |  int res;
      |      ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 465 ms 13548 KB Output is correct
2 Correct 478 ms 13548 KB Output is correct
3 Correct 562 ms 15980 KB Output is correct
4 Correct 469 ms 13548 KB Output is correct
5 Correct 472 ms 13548 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 748 KB Output is correct
5 Correct 2 ms 748 KB Output is correct
6 Correct 1 ms 748 KB Output is correct
7 Correct 1 ms 748 KB Output is correct
8 Correct 1 ms 620 KB Output is correct
9 Correct 1 ms 748 KB Output is correct
10 Correct 2 ms 620 KB Output is correct
11 Correct 81 ms 2540 KB Output is correct
12 Correct 1 ms 748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1679 ms 22732 KB Output is correct
2 Correct 1122 ms 21868 KB Output is correct
3 Correct 1643 ms 22720 KB Output is correct
4 Correct 1674 ms 22492 KB Output is correct
5 Correct 1601 ms 21836 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 6416 ms 22752 KB Output is correct
10 Correct 1 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 884 ms 18540 KB Output is correct
2 Correct 870 ms 18544 KB Output is correct
3 Correct 876 ms 18540 KB Output is correct
4 Correct 924 ms 19976 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1649 ms 22444 KB Output is correct
2 Correct 1127 ms 21740 KB Output is correct
3 Correct 1655 ms 22640 KB Output is correct
4 Correct 1672 ms 22560 KB Output is correct
5 Correct 1646 ms 21836 KB Output is correct
6 Correct 913 ms 18540 KB Output is correct
7 Correct 894 ms 18540 KB Output is correct
8 Correct 884 ms 18572 KB Output is correct
9 Correct 914 ms 20004 KB Output is correct
10 Correct 473 ms 13548 KB Output is correct
11 Correct 518 ms 13548 KB Output is correct
12 Correct 576 ms 16364 KB Output is correct
13 Correct 473 ms 13676 KB Output is correct
14 Correct 472 ms 13548 KB Output is correct
15 Correct 1 ms 364 KB Output is correct
16 Correct 1 ms 364 KB Output is correct
17 Correct 1 ms 364 KB Output is correct
18 Correct 1 ms 748 KB Output is correct
19 Correct 1 ms 748 KB Output is correct
20 Correct 1 ms 748 KB Output is correct
21 Correct 1 ms 748 KB Output is correct
22 Correct 1 ms 620 KB Output is correct
23 Correct 1 ms 748 KB Output is correct
24 Correct 1 ms 748 KB Output is correct
25 Correct 81 ms 3052 KB Output is correct
26 Correct 1 ms 748 KB Output is correct
27 Correct 6274 ms 22852 KB Output is correct
28 Runtime error 273 ms 262148 KB Execution killed with signal 9
29 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1637 ms 22592 KB Output is correct
2 Correct 1110 ms 21996 KB Output is correct
3 Correct 1656 ms 22768 KB Output is correct
4 Correct 1662 ms 22592 KB Output is correct
5 Correct 1624 ms 21868 KB Output is correct
6 Correct 864 ms 18540 KB Output is correct
7 Correct 897 ms 18412 KB Output is correct
8 Correct 891 ms 18688 KB Output is correct
9 Correct 914 ms 20032 KB Output is correct
10 Correct 467 ms 13548 KB Output is correct
11 Correct 475 ms 13548 KB Output is correct
12 Correct 554 ms 16340 KB Output is correct
13 Correct 470 ms 13548 KB Output is correct
14 Correct 471 ms 13548 KB Output is correct
15 Runtime error 381 ms 262148 KB Execution killed with signal 9
16 Halted 0 ms 0 KB -