답안 #828874

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
828874 2023-08-17T18:06:36 Z QwertyPi From Hacks to Snitches (BOI21_watchmen) C++14
25 / 100
6000 ms 200460 KB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2.5e5 + 11;
const int MAXV = 2750 + 11;
const int MAXC = 1500 + 11;
const int MAXA = 2e6 + 11;
int cyc[MAXN], ci[MAXN], cl[MAXN], vi[MAXN];
vector<int> G[MAXN], H[MAXN];
int dp[MAXN], dp2[MAXV][MAXC];
bool vis[MAXN], vis2[MAXV][MAXC];
vector<pair<int, int>> ch[MAXA];
vector<int> cycles[MAXV];

struct edge{
	int u, v;
};

bool in_cycle(int v){
	return cyc[v] != 0;
}

int cycle_nxt(int v){
	assert(cyc[v] != 0);
	return cycles[cyc[v]][(ci[v] + 1) % cl[v]];
}

int cycle_prv(int v){
	assert(cyc[v] != 0);
	return cycles[cyc[v]][(ci[v] + cl[v] - 1) % cl[v]];
}

int32_t main(){
	cin.tie(0); cout.tie(0)->sync_with_stdio(false);
	int n, m; cin >> n >> m;
	vector<edge> E;
	for(int i = 0; i < m; i++){
		int u, v; cin >> u >> v;
		E.push_back({u, v});
	}
	int s_cyc = 0;
	int k; cin >> k;
	for(int i = 0; i < k; i++){
		vector<int> v;
		int l; cin >> l;
		for(int j = 0; j < l; j++){
			int u; cin >> u; v.push_back(u);
		}
		cycles[i + 1] = v;
		for(int j = 0; j < l; j++) cyc[v[j]] = i + 1, ci[v[j]] = j, cl[v[j]] = v.size(), vi[v[j]] = 1 + s_cyc + j; s_cyc += l;
	}

	for(int i = 0; i < m; i++){
		edge e = E[i];
		if(!in_cycle(e.u)) swap(e.u, e.v);
		if(in_cycle(e.u) && in_cycle(e.v)){
			if(e.u == cycle_nxt(e.v) || e.u == cycle_prv(e.v))
				continue;
			H[e.u].push_back(e.v);
			H[e.v].push_back(e.u);
		}else{
			G[e.u].push_back(e.v);
			G[e.v].push_back(e.u);
		}
	}
	// for(int i = 1; i <= n; i++) cout << cyc[i] << ' '; cout << endl;
	// for(int i = 1; i <= n; i++) cout << ci[i] << ' '; cout << endl;
	// for(int i = 1; i <= n; i++) cout << vi[i] << ' '; cout << endl;

	memset(dp, 0x3f, sizeof(dp));
	memset(dp2, 0x3f, sizeof(dp2));

	dp[1] = 0; ch[0].push_back({1, 0});
	for(int d = 0; d < MAXA; d++){
		for(auto [v, i] : ch[d]){
			// printf("dist[(%d %d)] = %d\n", v, i, d);
			if(!in_cycle(v)){
				assert(i == 0);
				if(vis[v]) continue; vis[v] = true;
				for(auto u : G[v]){
					if(!in_cycle(u)){
						if(dp[v] + 1 < dp[u]){
							dp[u] = dp[v] + 1;
							ch[d + 1].push_back({u, 0});
						}
					}else{
						vector<int> J;
						J.push_back(0); J.push_back(1);
						J.push_back((((ci[u] - dp[v]) % cl[u]) + cl[u]) % cl[u]);
						for(int j : J){
							int dst = dp[v] + 1 + j;
							if(dst % cl[u] == ci[u]) continue;
							if(dst < dp2[vi[u]][dst % cl[u]]){
								dp2[vi[u]][dst % cl[u]] = dst;
								ch[dst].push_back({u, dst % cl[u]});
							}
						}
					}
				}
			}else{
				if(!vis[v]){
					for(int i = 0; i < cl[v]; i++){
						dp[v] = min(dp[v], dp2[vi[v]][i]);
					}
					// printf("dp[%d] = %d\n", v, dp[v]);
					vis[v] = true;
					for(auto u : G[v]){
						assert(!in_cycle(u));
						if(dp[v] + 1 < dp[u]){
							dp[u] = dp[v] + 1;
							ch[d + 1].push_back({u, 0});
						}
					}
				}

				assert(d % cl[v] != ci[v]);

				if(vis2[vi[v]][d % cl[v]]) continue; vis2[vi[v]][d % cl[v]] = true;
				// stationery
				if((d + 1) % cl[v] != ci[v] && d + 1 < dp2[vi[v]][(d + 1) % cl[v]]){
					dp2[vi[v]][(d + 1) % cl[v]] = d + 1;
					ch[d + 1].push_back({v, (d + 1) % cl[v]});
				}

				for(auto u : H[v]){
					for(int j = 0; j <= cl[u] / cl[v]; j++){
						int dst = d + 1 + j * cl[v];
						if(dst % cl[u] != ci[u] && dst < dp2[vi[u]][dst % cl[u]]){
							dp2[vi[u]][dst % cl[u]] = dst;
							ch[dst].push_back({u, dst % cl[u]});
						}
					}
				}

				// forward
				int u = cycle_nxt(v);
				if(d + 1 < dp2[vi[u]][(d + 1) % cl[u]]){
					dp2[vi[u]][(d + 1) % cl[u]] = d + 1;
					ch[d + 1].push_back({u, (d + 1) % cl[u]});
				}
				
				// backward
				u = cycle_prv(v);
				if((d + 1) % cl[v] != ci[v] && (d + 2) % cl[v] != ci[v] && d + 1 < dp2[vi[u]][(d + 1) % cl[u]]){
					dp2[vi[u]][(d + 1) % cl[u]] = d + 1;
					ch[d + 1].push_back({u, (d + 1) % cl[u]});
				}
			}
		}
		ch[d].clear();
	}
	if(dp[n] == 0x3f3f3f3f){
		cout << "impossible" << endl;
	}else{
		cout << dp[n] << endl;
	}
}

Compilation message

watchmen.cpp: In function 'int32_t main()':
watchmen.cpp:51:3: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   51 |   for(int j = 0; j < l; j++) cyc[v[j]] = i + 1, ci[v[j]] = j, cl[v[j]] = v.size(), vi[v[j]] = 1 + s_cyc + j; s_cyc += l;
      |   ^~~
watchmen.cpp:51:110: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   51 |   for(int j = 0; j < l; j++) cyc[v[j]] = i + 1, ci[v[j]] = j, cl[v[j]] = v.size(), vi[v[j]] = 1 + s_cyc + j; s_cyc += l;
      |                                                                                                              ^~~~~
watchmen.cpp:76:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   76 |   for(auto [v, i] : ch[d]){
      |            ^
watchmen.cpp:80:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   80 |     if(vis[v]) continue; vis[v] = true;
      |     ^~
watchmen.cpp:80:26: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   80 |     if(vis[v]) continue; vis[v] = true;
      |                          ^~~
watchmen.cpp:119:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  119 |     if(vis2[vi[v]][d % cl[v]]) continue; vis2[vi[v]][d % cl[v]] = true;
      |     ^~
watchmen.cpp:119:42: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  119 |     if(vis2[vi[v]][d % cl[v]]) continue; vis2[vi[v]][d % cl[v]] = true;
      |                                          ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 78408 KB Output is correct
2 Correct 73 ms 85088 KB Output is correct
3 Correct 71 ms 83872 KB Output is correct
4 Correct 111 ms 83400 KB Output is correct
5 Correct 37 ms 76620 KB Output is correct
6 Correct 73 ms 83524 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 78408 KB Output is correct
2 Correct 73 ms 85004 KB Output is correct
3 Correct 71 ms 83828 KB Output is correct
4 Correct 112 ms 83372 KB Output is correct
5 Correct 36 ms 76648 KB Output is correct
6 Correct 71 ms 83528 KB Output is correct
7 Correct 76 ms 83908 KB Output is correct
8 Correct 87 ms 83948 KB Output is correct
9 Correct 71 ms 84084 KB Output is correct
10 Correct 76 ms 82884 KB Output is correct
11 Correct 69 ms 82448 KB Output is correct
12 Correct 70 ms 83552 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 78408 KB Output is correct
2 Correct 73 ms 85004 KB Output is correct
3 Correct 71 ms 83828 KB Output is correct
4 Correct 112 ms 83372 KB Output is correct
5 Correct 36 ms 76648 KB Output is correct
6 Correct 71 ms 83528 KB Output is correct
7 Correct 76 ms 83908 KB Output is correct
8 Correct 87 ms 83948 KB Output is correct
9 Correct 71 ms 84084 KB Output is correct
10 Correct 76 ms 82884 KB Output is correct
11 Correct 69 ms 82448 KB Output is correct
12 Correct 70 ms 83552 KB Output is correct
13 Correct 91 ms 78276 KB Output is correct
14 Correct 77 ms 84960 KB Output is correct
15 Correct 71 ms 83772 KB Output is correct
16 Correct 109 ms 83432 KB Output is correct
17 Correct 37 ms 76636 KB Output is correct
18 Correct 72 ms 83608 KB Output is correct
19 Correct 71 ms 83820 KB Output is correct
20 Correct 74 ms 83900 KB Output is correct
21 Correct 74 ms 84124 KB Output is correct
22 Correct 78 ms 82876 KB Output is correct
23 Correct 70 ms 82324 KB Output is correct
24 Correct 72 ms 83508 KB Output is correct
25 Correct 760 ms 148360 KB Output is correct
26 Correct 743 ms 154352 KB Output is correct
27 Correct 676 ms 150492 KB Output is correct
28 Correct 707 ms 154860 KB Output is correct
29 Correct 1109 ms 141696 KB Output is correct
30 Correct 1162 ms 144640 KB Output is correct
31 Correct 821 ms 154200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 78408 KB Output is correct
2 Correct 73 ms 85004 KB Output is correct
3 Correct 71 ms 83828 KB Output is correct
4 Correct 112 ms 83372 KB Output is correct
5 Correct 36 ms 76648 KB Output is correct
6 Correct 71 ms 83528 KB Output is correct
7 Correct 76 ms 83908 KB Output is correct
8 Correct 87 ms 83948 KB Output is correct
9 Correct 71 ms 84084 KB Output is correct
10 Correct 76 ms 82884 KB Output is correct
11 Correct 69 ms 82448 KB Output is correct
12 Correct 70 ms 83552 KB Output is correct
13 Correct 91 ms 78276 KB Output is correct
14 Correct 77 ms 84960 KB Output is correct
15 Correct 71 ms 83772 KB Output is correct
16 Correct 109 ms 83432 KB Output is correct
17 Correct 37 ms 76636 KB Output is correct
18 Correct 72 ms 83608 KB Output is correct
19 Correct 71 ms 83820 KB Output is correct
20 Correct 74 ms 83900 KB Output is correct
21 Correct 74 ms 84124 KB Output is correct
22 Correct 78 ms 82876 KB Output is correct
23 Correct 70 ms 82324 KB Output is correct
24 Correct 72 ms 83508 KB Output is correct
25 Correct 760 ms 148360 KB Output is correct
26 Correct 743 ms 154352 KB Output is correct
27 Correct 676 ms 150492 KB Output is correct
28 Correct 707 ms 154860 KB Output is correct
29 Correct 1109 ms 141696 KB Output is correct
30 Correct 1162 ms 144640 KB Output is correct
31 Correct 821 ms 154200 KB Output is correct
32 Correct 90 ms 78540 KB Output is correct
33 Correct 75 ms 85228 KB Output is correct
34 Correct 72 ms 84040 KB Output is correct
35 Correct 109 ms 83688 KB Output is correct
36 Correct 37 ms 76744 KB Output is correct
37 Correct 73 ms 83784 KB Output is correct
38 Correct 72 ms 84080 KB Output is correct
39 Correct 86 ms 84184 KB Output is correct
40 Correct 74 ms 84428 KB Output is correct
41 Correct 81 ms 83200 KB Output is correct
42 Correct 69 ms 82680 KB Output is correct
43 Correct 71 ms 83756 KB Output is correct
44 Correct 732 ms 148356 KB Output is correct
45 Correct 735 ms 154296 KB Output is correct
46 Correct 701 ms 150468 KB Output is correct
47 Correct 684 ms 154876 KB Output is correct
48 Correct 1068 ms 141696 KB Output is correct
49 Correct 1181 ms 144576 KB Output is correct
50 Correct 764 ms 154236 KB Output is correct
51 Correct 943 ms 175708 KB Output is correct
52 Correct 1026 ms 200460 KB Output is correct
53 Correct 841 ms 178560 KB Output is correct
54 Correct 654 ms 152900 KB Output is correct
55 Execution timed out 6045 ms 152524 KB Time limit exceeded
56 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 78408 KB Output is correct
2 Correct 73 ms 85088 KB Output is correct
3 Correct 71 ms 83872 KB Output is correct
4 Correct 111 ms 83400 KB Output is correct
5 Correct 37 ms 76620 KB Output is correct
6 Correct 73 ms 83524 KB Output is correct
7 Correct 90 ms 78408 KB Output is correct
8 Correct 73 ms 85004 KB Output is correct
9 Correct 71 ms 83828 KB Output is correct
10 Correct 112 ms 83372 KB Output is correct
11 Correct 36 ms 76648 KB Output is correct
12 Correct 71 ms 83528 KB Output is correct
13 Correct 76 ms 83908 KB Output is correct
14 Correct 87 ms 83948 KB Output is correct
15 Correct 71 ms 84084 KB Output is correct
16 Correct 76 ms 82884 KB Output is correct
17 Correct 69 ms 82448 KB Output is correct
18 Correct 70 ms 83552 KB Output is correct
19 Correct 40 ms 76404 KB Output is correct
20 Correct 35 ms 76404 KB Output is correct
21 Correct 36 ms 76392 KB Output is correct
22 Correct 92 ms 78268 KB Output is correct
23 Correct 77 ms 85008 KB Output is correct
24 Correct 74 ms 83788 KB Output is correct
25 Correct 109 ms 83408 KB Output is correct
26 Correct 39 ms 76756 KB Output is correct
27 Correct 70 ms 83532 KB Output is correct
28 Correct 71 ms 83928 KB Output is correct
29 Correct 70 ms 83968 KB Output is correct
30 Correct 70 ms 84104 KB Output is correct
31 Correct 80 ms 82884 KB Output is correct
32 Correct 78 ms 82488 KB Output is correct
33 Correct 71 ms 83528 KB Output is correct
34 Correct 760 ms 147460 KB Output is correct
35 Correct 764 ms 143380 KB Output is correct
36 Correct 771 ms 143284 KB Output is correct
37 Correct 721 ms 150216 KB Output is correct
38 Correct 752 ms 147352 KB Output is correct
39 Correct 940 ms 141244 KB Output is correct
40 Correct 917 ms 141920 KB Output is correct
41 Correct 914 ms 141492 KB Output is correct
42 Correct 757 ms 147464 KB Output is correct
43 Correct 764 ms 151936 KB Output is correct
44 Correct 751 ms 152084 KB Output is correct
45 Incorrect 724 ms 143728 KB Output isn't correct
46 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 78408 KB Output is correct
2 Correct 73 ms 85088 KB Output is correct
3 Correct 71 ms 83872 KB Output is correct
4 Correct 111 ms 83400 KB Output is correct
5 Correct 37 ms 76620 KB Output is correct
6 Correct 73 ms 83524 KB Output is correct
7 Correct 90 ms 78408 KB Output is correct
8 Correct 73 ms 85004 KB Output is correct
9 Correct 71 ms 83828 KB Output is correct
10 Correct 112 ms 83372 KB Output is correct
11 Correct 36 ms 76648 KB Output is correct
12 Correct 71 ms 83528 KB Output is correct
13 Correct 76 ms 83908 KB Output is correct
14 Correct 87 ms 83948 KB Output is correct
15 Correct 71 ms 84084 KB Output is correct
16 Correct 76 ms 82884 KB Output is correct
17 Correct 69 ms 82448 KB Output is correct
18 Correct 70 ms 83552 KB Output is correct
19 Correct 91 ms 78276 KB Output is correct
20 Correct 77 ms 84960 KB Output is correct
21 Correct 71 ms 83772 KB Output is correct
22 Correct 109 ms 83432 KB Output is correct
23 Correct 37 ms 76636 KB Output is correct
24 Correct 72 ms 83608 KB Output is correct
25 Correct 71 ms 83820 KB Output is correct
26 Correct 74 ms 83900 KB Output is correct
27 Correct 74 ms 84124 KB Output is correct
28 Correct 78 ms 82876 KB Output is correct
29 Correct 70 ms 82324 KB Output is correct
30 Correct 72 ms 83508 KB Output is correct
31 Correct 760 ms 148360 KB Output is correct
32 Correct 743 ms 154352 KB Output is correct
33 Correct 676 ms 150492 KB Output is correct
34 Correct 707 ms 154860 KB Output is correct
35 Correct 1109 ms 141696 KB Output is correct
36 Correct 1162 ms 144640 KB Output is correct
37 Correct 821 ms 154200 KB Output is correct
38 Correct 40 ms 76404 KB Output is correct
39 Correct 35 ms 76404 KB Output is correct
40 Correct 36 ms 76392 KB Output is correct
41 Correct 92 ms 78268 KB Output is correct
42 Correct 77 ms 85008 KB Output is correct
43 Correct 74 ms 83788 KB Output is correct
44 Correct 109 ms 83408 KB Output is correct
45 Correct 39 ms 76756 KB Output is correct
46 Correct 70 ms 83532 KB Output is correct
47 Correct 71 ms 83928 KB Output is correct
48 Correct 70 ms 83968 KB Output is correct
49 Correct 70 ms 84104 KB Output is correct
50 Correct 80 ms 82884 KB Output is correct
51 Correct 78 ms 82488 KB Output is correct
52 Correct 71 ms 83528 KB Output is correct
53 Correct 760 ms 147460 KB Output is correct
54 Correct 764 ms 143380 KB Output is correct
55 Correct 771 ms 143284 KB Output is correct
56 Correct 721 ms 150216 KB Output is correct
57 Correct 752 ms 147352 KB Output is correct
58 Correct 940 ms 141244 KB Output is correct
59 Correct 917 ms 141920 KB Output is correct
60 Correct 914 ms 141492 KB Output is correct
61 Correct 757 ms 147464 KB Output is correct
62 Correct 764 ms 151936 KB Output is correct
63 Correct 751 ms 152084 KB Output is correct
64 Incorrect 724 ms 143728 KB Output isn't correct
65 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 78408 KB Output is correct
2 Correct 73 ms 85088 KB Output is correct
3 Correct 71 ms 83872 KB Output is correct
4 Correct 111 ms 83400 KB Output is correct
5 Correct 37 ms 76620 KB Output is correct
6 Correct 73 ms 83524 KB Output is correct
7 Correct 90 ms 78408 KB Output is correct
8 Correct 73 ms 85004 KB Output is correct
9 Correct 71 ms 83828 KB Output is correct
10 Correct 112 ms 83372 KB Output is correct
11 Correct 36 ms 76648 KB Output is correct
12 Correct 71 ms 83528 KB Output is correct
13 Correct 76 ms 83908 KB Output is correct
14 Correct 87 ms 83948 KB Output is correct
15 Correct 71 ms 84084 KB Output is correct
16 Correct 76 ms 82884 KB Output is correct
17 Correct 69 ms 82448 KB Output is correct
18 Correct 70 ms 83552 KB Output is correct
19 Correct 91 ms 78276 KB Output is correct
20 Correct 77 ms 84960 KB Output is correct
21 Correct 71 ms 83772 KB Output is correct
22 Correct 109 ms 83432 KB Output is correct
23 Correct 37 ms 76636 KB Output is correct
24 Correct 72 ms 83608 KB Output is correct
25 Correct 71 ms 83820 KB Output is correct
26 Correct 74 ms 83900 KB Output is correct
27 Correct 74 ms 84124 KB Output is correct
28 Correct 78 ms 82876 KB Output is correct
29 Correct 70 ms 82324 KB Output is correct
30 Correct 72 ms 83508 KB Output is correct
31 Correct 760 ms 148360 KB Output is correct
32 Correct 743 ms 154352 KB Output is correct
33 Correct 676 ms 150492 KB Output is correct
34 Correct 707 ms 154860 KB Output is correct
35 Correct 1109 ms 141696 KB Output is correct
36 Correct 1162 ms 144640 KB Output is correct
37 Correct 821 ms 154200 KB Output is correct
38 Correct 90 ms 78540 KB Output is correct
39 Correct 75 ms 85228 KB Output is correct
40 Correct 72 ms 84040 KB Output is correct
41 Correct 109 ms 83688 KB Output is correct
42 Correct 37 ms 76744 KB Output is correct
43 Correct 73 ms 83784 KB Output is correct
44 Correct 72 ms 84080 KB Output is correct
45 Correct 86 ms 84184 KB Output is correct
46 Correct 74 ms 84428 KB Output is correct
47 Correct 81 ms 83200 KB Output is correct
48 Correct 69 ms 82680 KB Output is correct
49 Correct 71 ms 83756 KB Output is correct
50 Correct 732 ms 148356 KB Output is correct
51 Correct 735 ms 154296 KB Output is correct
52 Correct 701 ms 150468 KB Output is correct
53 Correct 684 ms 154876 KB Output is correct
54 Correct 1068 ms 141696 KB Output is correct
55 Correct 1181 ms 144576 KB Output is correct
56 Correct 764 ms 154236 KB Output is correct
57 Correct 943 ms 175708 KB Output is correct
58 Correct 1026 ms 200460 KB Output is correct
59 Correct 841 ms 178560 KB Output is correct
60 Correct 654 ms 152900 KB Output is correct
61 Execution timed out 6045 ms 152524 KB Time limit exceeded
62 Halted 0 ms 0 KB -