답안 #635240

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
635240 2022-08-25T17:35:55 Z youngyojun 웜뱃 (IOI13_wombats) C++17
100 / 100
6561 ms 113352 KB
#include "wombats.h"
#include <bits/stdc++.h>
#define INF (0x3f3f3f3f)
using namespace std;

int A[5001][201], B[5001][201], C[5001][201];

int H, W, Q;

int fdi[201][201];
void f(int du[][201], int dd[][201], int dp[][201], int m) {
	for(int i = 1, r, ri; i <= W; i++) {
		r = INF;
		for(int j = 1, t; j <= W; j++) {
			t = du[i][j] + B[m][j] + dd[j][i];
			if(t < r) { r = t; ri = j; }
		}
		dp[i][i] = r; fdi[i][i] = ri;
	}
	for(int q = 1; q < W; q++) {
		for(int s = 1, e = q+1, r, ri, rie; e <= W; s++, e++) {
			r = INF; rie = fdi[s+1][e];
			for(int j = fdi[s][e-1], t; j <= rie; j++) {
				t = du[s][j] + B[m][j] + dd[j][e];
				if(t < r) { r = t; ri = j; }
			}
			dp[s][e] = r; fdi[s][e] = ri;
		}
		for(int s = q+1, e = 1, r, ri, rie; s <= W; s++, e++) {
			r = INF; rie = fdi[s][e+1];
			for(int j = fdi[s-1][e], t; j <= rie; j++) {
				t = du[s][j] + B[m][j] + dd[j][e];
				if(t < r) { r = t; ri = j; }
			}
			dp[s][e] = r; fdi[s][e] = ri;
		}
	}
}

int rdp[3][201][201];
void run(int dp[][201], int x) {
	for(int i = 1; i <= W; i++) {
		dp[i][i] = 0;
		for(int j = i+1; j <= W; j++)
			dp[i][j] = dp[j][i] = C[x][j]-C[x][i];
	}
}
void run(int dp[][201], int s, int e) {
	run(rdp[0], s);
	for(int i = s+1; i <= e; i++) {
		run(rdp[1], i);
		f(rdp[0], rdp[1], rdp[2], i-1);
		memcpy(rdp[0], rdp[2], 201*201*4);
	}
	memcpy(dp, rdp[0], 201*201*4);
}

struct NOD {
	int dp[201][201];
	NOD *pl = NULL, *pr = NULL;

	void cal(int s, int e) {
		if(e-s < 20) {
			run(dp, s, e);
			return;
		}
		int m = (s+e) >> 1;
		pl = new NOD(); pr = new NOD();
		pl -> cal(s, m); pr -> cal(m+1, e);
		f(pl->dp, pr->dp, dp, m);
	}
	void upd(int s, int e, int x) {
		if(e-s < 20) {
			run(dp, s, e);
			return;
		}
		int m = (s+e) >> 1;
		if(x <= m) pl -> upd(s, m, x);
		else pr -> upd(m+1, e, x);
		f(pl->dp, pr->dp, dp, m);
	}
} nod;

void init(int H, int W, int A[5000][200], int B[5000][200]) {
	::H = H; ::W = W;
	for(int i = 1; i <= H; i++) {
		for(int j = 1; j < W; j++) {
			int c = A[i-1][j-1];
			::A[i][j] = c;
			::C[i][j+1] = ::C[i][j] + c;
		}
	}
	for(int i = 1; i < H; i++)
		for(int j = 1; j <= W; j++)
			::B[i][j] = B[i-1][j-1];

	nod.cal(1, H);
}

void changeH(int a, int b, int c) {
	a++; b++;
	A[a][b] = c;
	for(int i = 1; i < W; i++)
		C[a][i+1] = C[a][i] + A[a][i];
	nod.upd(1, H, a);
}

void changeV(int a, int b, int c) {
	a++; b++;
	B[a][b] = c;
	nod.upd(1, H, a);
}

int escape(int a, int b) {
	return nod.dp[a+1][b+1];
}

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;
      |      ^~~
wombats.cpp: In function 'void f(int (*)[201], int (*)[201], int (*)[201], int)':
wombats.cpp:35:28: warning: 'ri' may be used uninitialized in this function [-Wmaybe-uninitialized]
   35 |    dp[s][e] = r; fdi[s][e] = ri;
      |                  ~~~~~~~~~~^~~~
wombats.cpp:27:28: warning: 'ri' may be used uninitialized in this function [-Wmaybe-uninitialized]
   27 |    dp[s][e] = r; fdi[s][e] = ri;
      |                  ~~~~~~~~~~^~~~
wombats.cpp:18:27: warning: 'ri' may be used uninitialized in this function [-Wmaybe-uninitialized]
   18 |   dp[i][i] = r; fdi[i][i] = ri;
      |                 ~~~~~~~~~~^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 117 ms 90004 KB Output is correct
2 Correct 134 ms 90132 KB Output is correct
3 Correct 178 ms 92988 KB Output is correct
4 Correct 119 ms 90188 KB Output is correct
5 Correct 114 ms 90008 KB Output is correct
6 Correct 1 ms 572 KB Output is correct
7 Correct 1 ms 572 KB Output is correct
8 Correct 1 ms 596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Correct 1 ms 596 KB Output is correct
3 Correct 1 ms 596 KB Output is correct
4 Correct 1 ms 724 KB Output is correct
5 Correct 1 ms 724 KB Output is correct
6 Correct 2 ms 724 KB Output is correct
7 Correct 1 ms 724 KB Output is correct
8 Correct 1 ms 708 KB Output is correct
9 Correct 1 ms 724 KB Output is correct
10 Correct 1 ms 708 KB Output is correct
11 Correct 64 ms 3100 KB Output is correct
12 Correct 1 ms 724 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 157 ms 3480 KB Output is correct
2 Correct 111 ms 3540 KB Output is correct
3 Correct 155 ms 3540 KB Output is correct
4 Correct 154 ms 3512 KB Output is correct
5 Correct 155 ms 3540 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 1 ms 596 KB Output is correct
8 Correct 1 ms 596 KB Output is correct
9 Correct 493 ms 3544 KB Output is correct
10 Correct 1 ms 596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 125 ms 101940 KB Output is correct
2 Correct 132 ms 101812 KB Output is correct
3 Correct 140 ms 101836 KB Output is correct
4 Correct 153 ms 103304 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 148 ms 3536 KB Output is correct
2 Correct 119 ms 3540 KB Output is correct
3 Correct 156 ms 3544 KB Output is correct
4 Correct 153 ms 3544 KB Output is correct
5 Correct 154 ms 3540 KB Output is correct
6 Correct 128 ms 101952 KB Output is correct
7 Correct 124 ms 101916 KB Output is correct
8 Correct 125 ms 101896 KB Output is correct
9 Correct 158 ms 103432 KB Output is correct
10 Correct 118 ms 90108 KB Output is correct
11 Correct 117 ms 90128 KB Output is correct
12 Correct 179 ms 92912 KB Output is correct
13 Correct 127 ms 90116 KB Output is correct
14 Correct 115 ms 90092 KB Output is correct
15 Correct 1 ms 572 KB Output is correct
16 Correct 1 ms 596 KB Output is correct
17 Correct 1 ms 572 KB Output is correct
18 Correct 1 ms 708 KB Output is correct
19 Correct 1 ms 724 KB Output is correct
20 Correct 1 ms 724 KB Output is correct
21 Correct 1 ms 724 KB Output is correct
22 Correct 1 ms 764 KB Output is correct
23 Correct 1 ms 704 KB Output is correct
24 Correct 1 ms 724 KB Output is correct
25 Correct 67 ms 3140 KB Output is correct
26 Correct 1 ms 724 KB Output is correct
27 Correct 530 ms 3528 KB Output is correct
28 Correct 1385 ms 106552 KB Output is correct
29 Correct 1541 ms 102456 KB Output is correct
30 Correct 2025 ms 102596 KB Output is correct
31 Correct 1565 ms 107960 KB Output is correct
32 Correct 1 ms 580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 158 ms 3548 KB Output is correct
2 Correct 118 ms 3520 KB Output is correct
3 Correct 176 ms 3544 KB Output is correct
4 Correct 172 ms 3464 KB Output is correct
5 Correct 178 ms 3464 KB Output is correct
6 Correct 186 ms 101940 KB Output is correct
7 Correct 128 ms 101920 KB Output is correct
8 Correct 136 ms 102060 KB Output is correct
9 Correct 166 ms 103332 KB Output is correct
10 Correct 120 ms 90100 KB Output is correct
11 Correct 122 ms 90100 KB Output is correct
12 Correct 188 ms 92868 KB Output is correct
13 Correct 148 ms 90132 KB Output is correct
14 Correct 158 ms 90132 KB Output is correct
15 Correct 1666 ms 112212 KB Output is correct
16 Correct 6561 ms 113352 KB Output is correct
17 Correct 0 ms 596 KB Output is correct
18 Correct 0 ms 576 KB Output is correct
19 Correct 1 ms 596 KB Output is correct
20 Correct 1 ms 724 KB Output is correct
21 Correct 1 ms 724 KB Output is correct
22 Correct 1 ms 772 KB Output is correct
23 Correct 2 ms 704 KB Output is correct
24 Correct 1 ms 724 KB Output is correct
25 Correct 1 ms 724 KB Output is correct
26 Correct 1 ms 724 KB Output is correct
27 Correct 64 ms 3132 KB Output is correct
28 Correct 1 ms 724 KB Output is correct
29 Correct 506 ms 3540 KB Output is correct
30 Correct 1346 ms 106420 KB Output is correct
31 Correct 4877 ms 110892 KB Output is correct
32 Correct 4924 ms 111128 KB Output is correct
33 Correct 1543 ms 102712 KB Output is correct
34 Correct 5755 ms 107000 KB Output is correct
35 Correct 1553 ms 102544 KB Output is correct
36 Correct 5543 ms 106840 KB Output is correct
37 Correct 1487 ms 107980 KB Output is correct
38 Correct 5322 ms 111752 KB Output is correct
39 Correct 1 ms 596 KB Output is correct
40 Correct 5577 ms 107468 KB Output is correct