Submission #828875

# Submission time Handle Problem Language Result Execution time Memory
828875 2023-08-17T18:14:59 Z QwertyPi From Hacks to Snitches (BOI21_watchmen) C++14
25 / 100
6000 ms 200384 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]){
					vector<int> J; J.push_back(0); J.push_back(1);
					int c = (((ci[u] + 1) - (d + 1)) % cl[u] + cl[u]) % cl[u];
					J.push_back((c + cl[v] - 1) / cl[v]); 
					for(int j : 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;
      |                                          ^~~~
# Verdict Execution time Memory Grader output
1 Correct 186 ms 78408 KB Output is correct
2 Correct 75 ms 84980 KB Output is correct
3 Correct 71 ms 83756 KB Output is correct
4 Correct 211 ms 83348 KB Output is correct
5 Correct 39 ms 76688 KB Output is correct
6 Correct 72 ms 83528 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 180 ms 78224 KB Output is correct
2 Correct 74 ms 84988 KB Output is correct
3 Correct 72 ms 83852 KB Output is correct
4 Correct 205 ms 83456 KB Output is correct
5 Correct 44 ms 76876 KB Output is correct
6 Correct 70 ms 83612 KB Output is correct
7 Correct 71 ms 83820 KB Output is correct
8 Correct 73 ms 83900 KB Output is correct
9 Correct 77 ms 84228 KB Output is correct
10 Correct 95 ms 82864 KB Output is correct
11 Correct 71 ms 82428 KB Output is correct
12 Correct 76 ms 83528 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 180 ms 78224 KB Output is correct
2 Correct 74 ms 84988 KB Output is correct
3 Correct 72 ms 83852 KB Output is correct
4 Correct 205 ms 83456 KB Output is correct
5 Correct 44 ms 76876 KB Output is correct
6 Correct 70 ms 83612 KB Output is correct
7 Correct 71 ms 83820 KB Output is correct
8 Correct 73 ms 83900 KB Output is correct
9 Correct 77 ms 84228 KB Output is correct
10 Correct 95 ms 82864 KB Output is correct
11 Correct 71 ms 82428 KB Output is correct
12 Correct 76 ms 83528 KB Output is correct
13 Correct 177 ms 78264 KB Output is correct
14 Correct 77 ms 85008 KB Output is correct
15 Correct 71 ms 83776 KB Output is correct
16 Correct 202 ms 83396 KB Output is correct
17 Correct 37 ms 76712 KB Output is correct
18 Correct 73 ms 83580 KB Output is correct
19 Correct 70 ms 83924 KB Output is correct
20 Correct 74 ms 83972 KB Output is correct
21 Correct 70 ms 84176 KB Output is correct
22 Correct 114 ms 83068 KB Output is correct
23 Correct 70 ms 82376 KB Output is correct
24 Correct 70 ms 83584 KB Output is correct
25 Correct 757 ms 148376 KB Output is correct
26 Correct 847 ms 154356 KB Output is correct
27 Correct 694 ms 150380 KB Output is correct
28 Correct 658 ms 154844 KB Output is correct
29 Correct 1394 ms 141668 KB Output is correct
30 Correct 1723 ms 144556 KB Output is correct
31 Correct 819 ms 154216 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 180 ms 78224 KB Output is correct
2 Correct 74 ms 84988 KB Output is correct
3 Correct 72 ms 83852 KB Output is correct
4 Correct 205 ms 83456 KB Output is correct
5 Correct 44 ms 76876 KB Output is correct
6 Correct 70 ms 83612 KB Output is correct
7 Correct 71 ms 83820 KB Output is correct
8 Correct 73 ms 83900 KB Output is correct
9 Correct 77 ms 84228 KB Output is correct
10 Correct 95 ms 82864 KB Output is correct
11 Correct 71 ms 82428 KB Output is correct
12 Correct 76 ms 83528 KB Output is correct
13 Correct 177 ms 78264 KB Output is correct
14 Correct 77 ms 85008 KB Output is correct
15 Correct 71 ms 83776 KB Output is correct
16 Correct 202 ms 83396 KB Output is correct
17 Correct 37 ms 76712 KB Output is correct
18 Correct 73 ms 83580 KB Output is correct
19 Correct 70 ms 83924 KB Output is correct
20 Correct 74 ms 83972 KB Output is correct
21 Correct 70 ms 84176 KB Output is correct
22 Correct 114 ms 83068 KB Output is correct
23 Correct 70 ms 82376 KB Output is correct
24 Correct 70 ms 83584 KB Output is correct
25 Correct 757 ms 148376 KB Output is correct
26 Correct 847 ms 154356 KB Output is correct
27 Correct 694 ms 150380 KB Output is correct
28 Correct 658 ms 154844 KB Output is correct
29 Correct 1394 ms 141668 KB Output is correct
30 Correct 1723 ms 144556 KB Output is correct
31 Correct 819 ms 154216 KB Output is correct
32 Correct 179 ms 78272 KB Output is correct
33 Correct 75 ms 84948 KB Output is correct
34 Correct 74 ms 83924 KB Output is correct
35 Correct 208 ms 83468 KB Output is correct
36 Correct 38 ms 76764 KB Output is correct
37 Correct 71 ms 83552 KB Output is correct
38 Correct 73 ms 83912 KB Output is correct
39 Correct 69 ms 83896 KB Output is correct
40 Correct 70 ms 84076 KB Output is correct
41 Correct 100 ms 82984 KB Output is correct
42 Correct 73 ms 82404 KB Output is correct
43 Correct 87 ms 83552 KB Output is correct
44 Correct 786 ms 148428 KB Output is correct
45 Correct 729 ms 154348 KB Output is correct
46 Correct 704 ms 150416 KB Output is correct
47 Correct 671 ms 154868 KB Output is correct
48 Correct 1425 ms 141676 KB Output is correct
49 Correct 1741 ms 144584 KB Output is correct
50 Correct 826 ms 154312 KB Output is correct
51 Correct 912 ms 175832 KB Output is correct
52 Correct 955 ms 200384 KB Output is correct
53 Correct 845 ms 178576 KB Output is correct
54 Correct 660 ms 152876 KB Output is correct
55 Execution timed out 6088 ms 152008 KB Time limit exceeded
56 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 186 ms 78408 KB Output is correct
2 Correct 75 ms 84980 KB Output is correct
3 Correct 71 ms 83756 KB Output is correct
4 Correct 211 ms 83348 KB Output is correct
5 Correct 39 ms 76688 KB Output is correct
6 Correct 72 ms 83528 KB Output is correct
7 Correct 180 ms 78224 KB Output is correct
8 Correct 74 ms 84988 KB Output is correct
9 Correct 72 ms 83852 KB Output is correct
10 Correct 205 ms 83456 KB Output is correct
11 Correct 44 ms 76876 KB Output is correct
12 Correct 70 ms 83612 KB Output is correct
13 Correct 71 ms 83820 KB Output is correct
14 Correct 73 ms 83900 KB Output is correct
15 Correct 77 ms 84228 KB Output is correct
16 Correct 95 ms 82864 KB Output is correct
17 Correct 71 ms 82428 KB Output is correct
18 Correct 76 ms 83528 KB Output is correct
19 Correct 36 ms 76372 KB Output is correct
20 Correct 38 ms 76372 KB Output is correct
21 Correct 36 ms 76408 KB Output is correct
22 Correct 175 ms 78276 KB Output is correct
23 Correct 73 ms 84944 KB Output is correct
24 Correct 71 ms 83848 KB Output is correct
25 Correct 202 ms 83456 KB Output is correct
26 Correct 37 ms 76748 KB Output is correct
27 Correct 70 ms 83524 KB Output is correct
28 Correct 71 ms 83892 KB Output is correct
29 Correct 79 ms 84056 KB Output is correct
30 Correct 75 ms 84132 KB Output is correct
31 Correct 97 ms 82904 KB Output is correct
32 Correct 71 ms 82376 KB Output is correct
33 Correct 72 ms 83532 KB Output is correct
34 Correct 773 ms 147488 KB Output is correct
35 Correct 775 ms 143348 KB Output is correct
36 Correct 765 ms 143372 KB Output is correct
37 Correct 742 ms 150088 KB Output is correct
38 Correct 767 ms 147344 KB Output is correct
39 Correct 1035 ms 141128 KB Output is correct
40 Correct 1046 ms 141944 KB Output is correct
41 Correct 971 ms 141476 KB Output is correct
42 Correct 774 ms 147416 KB Output is correct
43 Correct 801 ms 152000 KB Output is correct
44 Correct 900 ms 152084 KB Output is correct
45 Incorrect 717 ms 143628 KB Output isn't correct
46 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 186 ms 78408 KB Output is correct
2 Correct 75 ms 84980 KB Output is correct
3 Correct 71 ms 83756 KB Output is correct
4 Correct 211 ms 83348 KB Output is correct
5 Correct 39 ms 76688 KB Output is correct
6 Correct 72 ms 83528 KB Output is correct
7 Correct 180 ms 78224 KB Output is correct
8 Correct 74 ms 84988 KB Output is correct
9 Correct 72 ms 83852 KB Output is correct
10 Correct 205 ms 83456 KB Output is correct
11 Correct 44 ms 76876 KB Output is correct
12 Correct 70 ms 83612 KB Output is correct
13 Correct 71 ms 83820 KB Output is correct
14 Correct 73 ms 83900 KB Output is correct
15 Correct 77 ms 84228 KB Output is correct
16 Correct 95 ms 82864 KB Output is correct
17 Correct 71 ms 82428 KB Output is correct
18 Correct 76 ms 83528 KB Output is correct
19 Correct 177 ms 78264 KB Output is correct
20 Correct 77 ms 85008 KB Output is correct
21 Correct 71 ms 83776 KB Output is correct
22 Correct 202 ms 83396 KB Output is correct
23 Correct 37 ms 76712 KB Output is correct
24 Correct 73 ms 83580 KB Output is correct
25 Correct 70 ms 83924 KB Output is correct
26 Correct 74 ms 83972 KB Output is correct
27 Correct 70 ms 84176 KB Output is correct
28 Correct 114 ms 83068 KB Output is correct
29 Correct 70 ms 82376 KB Output is correct
30 Correct 70 ms 83584 KB Output is correct
31 Correct 757 ms 148376 KB Output is correct
32 Correct 847 ms 154356 KB Output is correct
33 Correct 694 ms 150380 KB Output is correct
34 Correct 658 ms 154844 KB Output is correct
35 Correct 1394 ms 141668 KB Output is correct
36 Correct 1723 ms 144556 KB Output is correct
37 Correct 819 ms 154216 KB Output is correct
38 Correct 36 ms 76372 KB Output is correct
39 Correct 38 ms 76372 KB Output is correct
40 Correct 36 ms 76408 KB Output is correct
41 Correct 175 ms 78276 KB Output is correct
42 Correct 73 ms 84944 KB Output is correct
43 Correct 71 ms 83848 KB Output is correct
44 Correct 202 ms 83456 KB Output is correct
45 Correct 37 ms 76748 KB Output is correct
46 Correct 70 ms 83524 KB Output is correct
47 Correct 71 ms 83892 KB Output is correct
48 Correct 79 ms 84056 KB Output is correct
49 Correct 75 ms 84132 KB Output is correct
50 Correct 97 ms 82904 KB Output is correct
51 Correct 71 ms 82376 KB Output is correct
52 Correct 72 ms 83532 KB Output is correct
53 Correct 773 ms 147488 KB Output is correct
54 Correct 775 ms 143348 KB Output is correct
55 Correct 765 ms 143372 KB Output is correct
56 Correct 742 ms 150088 KB Output is correct
57 Correct 767 ms 147344 KB Output is correct
58 Correct 1035 ms 141128 KB Output is correct
59 Correct 1046 ms 141944 KB Output is correct
60 Correct 971 ms 141476 KB Output is correct
61 Correct 774 ms 147416 KB Output is correct
62 Correct 801 ms 152000 KB Output is correct
63 Correct 900 ms 152084 KB Output is correct
64 Incorrect 717 ms 143628 KB Output isn't correct
65 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 186 ms 78408 KB Output is correct
2 Correct 75 ms 84980 KB Output is correct
3 Correct 71 ms 83756 KB Output is correct
4 Correct 211 ms 83348 KB Output is correct
5 Correct 39 ms 76688 KB Output is correct
6 Correct 72 ms 83528 KB Output is correct
7 Correct 180 ms 78224 KB Output is correct
8 Correct 74 ms 84988 KB Output is correct
9 Correct 72 ms 83852 KB Output is correct
10 Correct 205 ms 83456 KB Output is correct
11 Correct 44 ms 76876 KB Output is correct
12 Correct 70 ms 83612 KB Output is correct
13 Correct 71 ms 83820 KB Output is correct
14 Correct 73 ms 83900 KB Output is correct
15 Correct 77 ms 84228 KB Output is correct
16 Correct 95 ms 82864 KB Output is correct
17 Correct 71 ms 82428 KB Output is correct
18 Correct 76 ms 83528 KB Output is correct
19 Correct 177 ms 78264 KB Output is correct
20 Correct 77 ms 85008 KB Output is correct
21 Correct 71 ms 83776 KB Output is correct
22 Correct 202 ms 83396 KB Output is correct
23 Correct 37 ms 76712 KB Output is correct
24 Correct 73 ms 83580 KB Output is correct
25 Correct 70 ms 83924 KB Output is correct
26 Correct 74 ms 83972 KB Output is correct
27 Correct 70 ms 84176 KB Output is correct
28 Correct 114 ms 83068 KB Output is correct
29 Correct 70 ms 82376 KB Output is correct
30 Correct 70 ms 83584 KB Output is correct
31 Correct 757 ms 148376 KB Output is correct
32 Correct 847 ms 154356 KB Output is correct
33 Correct 694 ms 150380 KB Output is correct
34 Correct 658 ms 154844 KB Output is correct
35 Correct 1394 ms 141668 KB Output is correct
36 Correct 1723 ms 144556 KB Output is correct
37 Correct 819 ms 154216 KB Output is correct
38 Correct 179 ms 78272 KB Output is correct
39 Correct 75 ms 84948 KB Output is correct
40 Correct 74 ms 83924 KB Output is correct
41 Correct 208 ms 83468 KB Output is correct
42 Correct 38 ms 76764 KB Output is correct
43 Correct 71 ms 83552 KB Output is correct
44 Correct 73 ms 83912 KB Output is correct
45 Correct 69 ms 83896 KB Output is correct
46 Correct 70 ms 84076 KB Output is correct
47 Correct 100 ms 82984 KB Output is correct
48 Correct 73 ms 82404 KB Output is correct
49 Correct 87 ms 83552 KB Output is correct
50 Correct 786 ms 148428 KB Output is correct
51 Correct 729 ms 154348 KB Output is correct
52 Correct 704 ms 150416 KB Output is correct
53 Correct 671 ms 154868 KB Output is correct
54 Correct 1425 ms 141676 KB Output is correct
55 Correct 1741 ms 144584 KB Output is correct
56 Correct 826 ms 154312 KB Output is correct
57 Correct 912 ms 175832 KB Output is correct
58 Correct 955 ms 200384 KB Output is correct
59 Correct 845 ms 178576 KB Output is correct
60 Correct 660 ms 152876 KB Output is correct
61 Execution timed out 6088 ms 152008 KB Time limit exceeded
62 Halted 0 ms 0 KB -