답안 #1043324

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1043324 2024-08-04T08:16:54 Z javotaz LOSTIKS (INOI20_lostiks) C++17
36 / 100
778 ms 120660 KB
// In the Name of Allah

#include<bits/stdc++.h>
using namespace std;

#pragma GCC optimize("Ofast,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,avx,avx2,sse4.2,popcnt,tune=native")

typedef long long ll;

#define F first
#define S second
#define pii pair<int, int>
#define pb push_back
#define pp pop_back
#define all(x) x.begin(), x.end()

const int N = 1e6 + 12, M = 20, inf = 8e8;
vector<pii> g[N];
int n, s, t, par[N], dp[(1 << M) + 4][M], p[N], kd[N], bt[M], sz, pd[N], e[N];
pii f[2 * M + 2][2 * M + 2];
bool mrk[N];
vector<int> v, d;

void ip() {
	cin >> n >> s >> t;
	for (int i = 1; i < n; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		g[u].pb({v, w});
		g[v].pb({u, w});
	}
}

void dfs(int u) {
	for (auto i: g[u])
		if (i.F != par[u]) { 
			par[i.F] = u;
			e[i.F] = e[u] + 1;
			if (i.S) {
				pd[i.F] = d.size(), d.pb(i.F), kd[i.F] = i.S;
				v.pb(u), v.pb(i.S);
			}
			dfs(i.F);
		}
}

void dfs2(int u, int rt, int h = 0, int mask = 0, int par = -1) {
	if (mrk[u])
		f[rt][p[u]] = {h, mask};
	for (auto i: g[u])
		if (i.F != par)
			dfs2(i.F, rt, h + 1, (i.S? (mask | (1 << pd[(e[u] < e[i.F])? i.F : u])) : mask), u);
}

void solve() {
	par[s] = s;
	dfs(s);
	v.pb(s), v.pb(t);
	sort(all(v));
	v.resize(unique(all(v)) - v.begin());
	for (int i = 0; i < v.size(); i++) 
		p[v[i]] = i, mrk[v[i]] = true;
	for (int i = 0; i < v.size(); i++)
		dfs2(v[i], i);
	memset(dp, 63, sizeof dp);
	int c = d.size();
	int ans = inf;
	for (int mask = 1; mask < (1 << c); ++mask) {
		sz = 0;
		for (int i = 0; i < c; i++)
			if ((mask >> i) & 1)
				bt[sz++] = i;
		for (int id1 = 0; id1 < sz; ++id1) {
			int i = bt[id1];
			int u = d[i], ku = kd[d[i]], x = mask ^ (1 << i);
			if (__builtin_popcount(mask) == 1) {
				if (f[p[s]][p[ku]].S == x && f[p[ku]][p[par[u]]].S == x)
					dp[mask][i] = f[p[s]][p[ku]].F + f[p[ku]][p[par[u]]].F;
			}
			else {
				for (int id2 = 0; id2 < c; ++id2)
					if (id2 != id1) {
						int j = bt[id2], v = d[bt[id2]];
						if ((f[p[par[v]]][p[ku]].S | x) == x && (f[p[ku]][p[par[u]]].S | x) == x)
							dp[mask][i] = min(dp[mask][i], dp[x][j] + f[p[par[v]]][p[ku]].F + f[p[ku]][p[par[u]]].F);
					}
			}
			if ((f[p[par[u]]][p[t]].S | mask) == mask)
				ans = min(ans, dp[mask][i] + f[p[par[u]]][p[t]].F);
		}
	}
	cout << ((ans == inf)? -1 : ans) << '\n';
}

int32_t main() {
	ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ip(), solve();
	return 0;
}

Compilation message

Main.cpp: In function 'void solve()':
Main.cpp:62:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |  for (int i = 0; i < v.size(); i++)
      |                  ~~^~~~~~~~~~
Main.cpp:64:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |  for (int i = 0; i < v.size(); i++)
      |                  ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 105808 KB Output is correct
2 Correct 42 ms 105920 KB Output is correct
3 Correct 99 ms 112208 KB Output is correct
4 Correct 93 ms 112468 KB Output is correct
5 Correct 97 ms 112460 KB Output is correct
6 Correct 99 ms 112104 KB Output is correct
7 Correct 107 ms 112464 KB Output is correct
8 Correct 92 ms 112368 KB Output is correct
9 Correct 97 ms 112592 KB Output is correct
10 Correct 96 ms 112212 KB Output is correct
11 Correct 90 ms 112400 KB Output is correct
12 Correct 95 ms 114512 KB Output is correct
13 Correct 98 ms 115280 KB Output is correct
14 Correct 106 ms 114100 KB Output is correct
15 Correct 93 ms 114256 KB Output is correct
16 Correct 115 ms 115540 KB Output is correct
17 Correct 110 ms 115536 KB Output is correct
18 Correct 98 ms 116048 KB Output is correct
19 Correct 100 ms 120564 KB Output is correct
20 Correct 98 ms 120656 KB Output is correct
21 Correct 105 ms 120660 KB Output is correct
22 Correct 39 ms 106012 KB Output is correct
23 Correct 44 ms 106068 KB Output is correct
24 Correct 38 ms 105908 KB Output is correct
25 Correct 37 ms 106064 KB Output is correct
26 Incorrect 44 ms 106068 KB Output isn't correct
27 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 106008 KB Output is correct
2 Correct 37 ms 105832 KB Output is correct
3 Correct 37 ms 106072 KB Output is correct
4 Correct 40 ms 106068 KB Output is correct
5 Correct 328 ms 106324 KB Output is correct
6 Correct 326 ms 106528 KB Output is correct
7 Correct 338 ms 106504 KB Output is correct
8 Correct 367 ms 106320 KB Output is correct
9 Correct 350 ms 106316 KB Output is correct
10 Correct 278 ms 106360 KB Output is correct
11 Correct 267 ms 106576 KB Output is correct
12 Correct 277 ms 106324 KB Output is correct
13 Correct 285 ms 106324 KB Output is correct
14 Correct 267 ms 106576 KB Output is correct
15 Correct 349 ms 106388 KB Output is correct
16 Correct 343 ms 106580 KB Output is correct
17 Correct 356 ms 106580 KB Output is correct
18 Correct 281 ms 106576 KB Output is correct
19 Correct 272 ms 106576 KB Output is correct
20 Correct 297 ms 106580 KB Output is correct
21 Correct 288 ms 106800 KB Output is correct
22 Correct 273 ms 107100 KB Output is correct
23 Correct 268 ms 107096 KB Output is correct
24 Correct 272 ms 107088 KB Output is correct
25 Correct 778 ms 106012 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 105808 KB Output is correct
2 Correct 42 ms 105920 KB Output is correct
3 Correct 99 ms 112208 KB Output is correct
4 Correct 93 ms 112468 KB Output is correct
5 Correct 97 ms 112460 KB Output is correct
6 Correct 99 ms 112104 KB Output is correct
7 Correct 107 ms 112464 KB Output is correct
8 Correct 92 ms 112368 KB Output is correct
9 Correct 97 ms 112592 KB Output is correct
10 Correct 96 ms 112212 KB Output is correct
11 Correct 90 ms 112400 KB Output is correct
12 Correct 95 ms 114512 KB Output is correct
13 Correct 98 ms 115280 KB Output is correct
14 Correct 106 ms 114100 KB Output is correct
15 Correct 93 ms 114256 KB Output is correct
16 Correct 115 ms 115540 KB Output is correct
17 Correct 110 ms 115536 KB Output is correct
18 Correct 98 ms 116048 KB Output is correct
19 Correct 100 ms 120564 KB Output is correct
20 Correct 98 ms 120656 KB Output is correct
21 Correct 105 ms 120660 KB Output is correct
22 Correct 39 ms 106012 KB Output is correct
23 Correct 44 ms 106068 KB Output is correct
24 Correct 38 ms 105908 KB Output is correct
25 Correct 37 ms 106064 KB Output is correct
26 Incorrect 44 ms 106068 KB Output isn't correct
27 Halted 0 ms 0 KB -