답안 #469274

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
469274 2021-08-31T10:40:39 Z sinamhdv LOSTIKS (INOI20_lostiks) C++11
100 / 100
1252 ms 309800 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod = 1000 * 1000 * 1000 + 7;
const int INF = 1e9 + 100;
const ll LINF = 1e18 + 100;

#ifdef DEBUG
#define dbg(x) cout << #x << " = " << (x) << endl << flush;
#define dbgr(s, f) { cout << #s << ": "; for (auto _ = (s); _ != (f); _++) cout << *_ << ' '; cout << endl << flush; }
#else
#define dbg(x) ;
#define dbgr(s, f) ;
#endif
#define fast_io ios::sync_with_stdio(0); cin.tie(0);
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define fr first
#define sc second
#define endl '\n'

const int MAXN = 1000100;
const int MAXE = 22;
const int LOGN = 25;

int n, s, t, m;
int ef[MAXN], eto[MAXN], ky[MAXN], kind[MAXN];
vector<int> adj[MAXN];
int lpar[LOGN][MAXN];
int h[MAXN];
int pth[MAXN];
int lck[MAXE];
int dp[1 << 20][MAXE];
int inp[MAXE];
int cost[MAXE][MAXE];
int tot;

void dfs(int v)
{
	for (int e : adj[v])
	{
		int u = ef[e] ^ eto[e] ^ v;
		if (u == lpar[0][v]) continue;
		lpar[0][u] = v;
		h[u] = h[v] + 1;
		pth[u] = pth[v] | (ky[e] ? (1 << kind[e]) : 0);
		dfs(u);
	}
}

void bkdfs(int v)
{
	tot |= (1 << v);
	FOR(i, 0, m) if ((inp[v] >> i & 1) && !(tot >> i & 1)) bkdfs(i);
}

inline int getpar(int x, int d)
{
	FOR(i, 0, LOGN) if (d >> i & 1) x = lpar[i][x];
	return x;
}

inline int getlca(int x, int y)
{
	if (h[x] > h[y]) swap(x, y);
	y = getpar(y, h[y] - h[x]);
	if (x == y) return x;
	for (int i = LOGN - 1; i >= 0; i--)
	{
		if (lpar[i][x] != lpar[i][y])
		{
			x = lpar[i][x];
			y = lpar[i][y];
		}
	}
	return lpar[0][x];
}

int32_t main(void)
{
	fast_io;
	cin >> n >> s >> t;
	FOR(i, 0, n - 1)
	{
		cin >> ef[i] >> eto[i] >> ky[i];
		adj[ef[i]].pb(i);
		adj[eto[i]].pb(i);
		if (ky[i])
		{
			lck[m] = i;
			kind[i] = m;
			m++;
		}
	}

	dbg(m);

	dfs(s);

	dbgr(pth + 1, pth + n + 1);
	if (pth[t] == 0)
	{
		return cout << h[t] << endl, 0;
	}

	FOR(i, 0, n - 1) if (h[ef[i]] > h[eto[i]]) swap(ef[i], eto[i]);

	FOR(i, 1, LOGN) FOR(j, 1, n + 1) lpar[i][j] = lpar[i - 1][lpar[i - 1][j]];

	FOR(i, 0, m)
	{
		int e = lck[i];
		inp[i] = (pth[ef[e]] | pth[ky[e]]);
	}

	FOR(i, 0, m) FOR(j, 0, m) if (i != j)
	{
		int x = ef[lck[i]];
		int y = ky[lck[j]];
		int z = ef[lck[j]];
		cost[i][j] = h[x] + h[y] - 2 * h[getlca(x, y)] + h[y] + h[z] - 2 * h[getlca(y, z)];

//		cout << i << ' ' << j << ' ' << cost[i][j] << endl;
	}

	dbgr(h + 1, h + n + 1);
	dbgr(pth + 1, pth + n + 1);
	dbgr(lck, lck + m);
	dbgr(inp, inp + m);

	FOR(mask, 1, 1 << m) fill(dp[mask], dp[mask] + MAXE, INF);

	FOR(mask, 1, 1 << m)
	{
		if (__builtin_popcount(mask) == 1)
		{
			int v = __lg(mask);
			if (!(inp[v] & mask)) dp[mask][v] = 0;
			continue;
		}
		FOR(v, 0, m)
		{
			if ((mask >> v & 1) && (inp[v] & mask) == 0)
			{
				int sub = mask ^ (1 << v);
				FOR(x, 0, m) if (sub >> x & 1)
				{
					dp[mask][v] = min(dp[mask][v], dp[sub][x] + cost[v][x]);
				}
			}
		}
	}

//	FOR(mask, 0, 1 << m) FOR(v, 0, m) cout << v << ' ' << mask << ' ' << dp[mask][v] << endl;

	int laste = -1;
	FOR(i, 0, m) if (pth[t] >> i & 1) if (laste == -1 || h[ef[lck[i]]] > h[ef[lck[laste]]]) laste = i;

	bkdfs(laste);
	int ans = INF;
	FOR(v, 0, m)
	{
		int cs = h[ky[lck[v]]] + h[ky[lck[v]]] + h[ef[lck[v]]] - 2 * h[getlca(ky[lck[v]], ef[lck[v]])];
		ans = min(ans, cs + dp[tot][v]);
	}

	if (ans >= INF) return cout << "-1\n", 0;
	ans += h[t] - h[ef[lck[laste]]];

	cout << ans << endl;

	return 0;
}


# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 24012 KB Output is correct
2 Correct 13 ms 24016 KB Output is correct
3 Correct 75 ms 39188 KB Output is correct
4 Correct 72 ms 39136 KB Output is correct
5 Correct 83 ms 39272 KB Output is correct
6 Correct 72 ms 39148 KB Output is correct
7 Correct 76 ms 39216 KB Output is correct
8 Correct 75 ms 39364 KB Output is correct
9 Correct 71 ms 39492 KB Output is correct
10 Correct 72 ms 39216 KB Output is correct
11 Correct 79 ms 39332 KB Output is correct
12 Correct 67 ms 41224 KB Output is correct
13 Correct 68 ms 42048 KB Output is correct
14 Correct 68 ms 41684 KB Output is correct
15 Correct 69 ms 42704 KB Output is correct
16 Correct 70 ms 43500 KB Output is correct
17 Correct 71 ms 43464 KB Output is correct
18 Correct 71 ms 43912 KB Output is correct
19 Correct 75 ms 48084 KB Output is correct
20 Correct 72 ms 47800 KB Output is correct
21 Correct 72 ms 47584 KB Output is correct
22 Correct 14 ms 24012 KB Output is correct
23 Correct 13 ms 24012 KB Output is correct
24 Correct 15 ms 23980 KB Output is correct
25 Correct 13 ms 24036 KB Output is correct
26 Correct 13 ms 23804 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 23980 KB Output is correct
2 Correct 15 ms 24052 KB Output is correct
3 Correct 14 ms 24140 KB Output is correct
4 Correct 14 ms 24140 KB Output is correct
5 Correct 170 ms 70236 KB Output is correct
6 Correct 143 ms 70284 KB Output is correct
7 Correct 195 ms 70348 KB Output is correct
8 Correct 147 ms 70332 KB Output is correct
9 Correct 167 ms 70336 KB Output is correct
10 Correct 110 ms 70348 KB Output is correct
11 Correct 110 ms 70348 KB Output is correct
12 Correct 115 ms 70468 KB Output is correct
13 Correct 109 ms 70252 KB Output is correct
14 Correct 111 ms 70360 KB Output is correct
15 Correct 152 ms 70372 KB Output is correct
16 Correct 190 ms 70432 KB Output is correct
17 Correct 155 ms 70340 KB Output is correct
18 Correct 113 ms 70408 KB Output is correct
19 Correct 112 ms 70516 KB Output is correct
20 Correct 110 ms 70476 KB Output is correct
21 Correct 110 ms 70684 KB Output is correct
22 Correct 111 ms 70788 KB Output is correct
23 Correct 110 ms 70772 KB Output is correct
24 Correct 109 ms 70800 KB Output is correct
25 Correct 832 ms 114328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 24012 KB Output is correct
2 Correct 13 ms 24016 KB Output is correct
3 Correct 75 ms 39188 KB Output is correct
4 Correct 72 ms 39136 KB Output is correct
5 Correct 83 ms 39272 KB Output is correct
6 Correct 72 ms 39148 KB Output is correct
7 Correct 76 ms 39216 KB Output is correct
8 Correct 75 ms 39364 KB Output is correct
9 Correct 71 ms 39492 KB Output is correct
10 Correct 72 ms 39216 KB Output is correct
11 Correct 79 ms 39332 KB Output is correct
12 Correct 67 ms 41224 KB Output is correct
13 Correct 68 ms 42048 KB Output is correct
14 Correct 68 ms 41684 KB Output is correct
15 Correct 69 ms 42704 KB Output is correct
16 Correct 70 ms 43500 KB Output is correct
17 Correct 71 ms 43464 KB Output is correct
18 Correct 71 ms 43912 KB Output is correct
19 Correct 75 ms 48084 KB Output is correct
20 Correct 72 ms 47800 KB Output is correct
21 Correct 72 ms 47584 KB Output is correct
22 Correct 14 ms 24012 KB Output is correct
23 Correct 13 ms 24012 KB Output is correct
24 Correct 15 ms 23980 KB Output is correct
25 Correct 13 ms 24036 KB Output is correct
26 Correct 13 ms 23804 KB Output is correct
27 Correct 14 ms 23980 KB Output is correct
28 Correct 15 ms 24052 KB Output is correct
29 Correct 14 ms 24140 KB Output is correct
30 Correct 14 ms 24140 KB Output is correct
31 Correct 170 ms 70236 KB Output is correct
32 Correct 143 ms 70284 KB Output is correct
33 Correct 195 ms 70348 KB Output is correct
34 Correct 147 ms 70332 KB Output is correct
35 Correct 167 ms 70336 KB Output is correct
36 Correct 110 ms 70348 KB Output is correct
37 Correct 110 ms 70348 KB Output is correct
38 Correct 115 ms 70468 KB Output is correct
39 Correct 109 ms 70252 KB Output is correct
40 Correct 111 ms 70360 KB Output is correct
41 Correct 152 ms 70372 KB Output is correct
42 Correct 190 ms 70432 KB Output is correct
43 Correct 155 ms 70340 KB Output is correct
44 Correct 113 ms 70408 KB Output is correct
45 Correct 112 ms 70516 KB Output is correct
46 Correct 110 ms 70476 KB Output is correct
47 Correct 110 ms 70684 KB Output is correct
48 Correct 111 ms 70788 KB Output is correct
49 Correct 110 ms 70772 KB Output is correct
50 Correct 109 ms 70800 KB Output is correct
51 Correct 832 ms 114328 KB Output is correct
52 Correct 1196 ms 194972 KB Output is correct
53 Correct 1212 ms 195012 KB Output is correct
54 Correct 1187 ms 192796 KB Output is correct
55 Correct 1223 ms 192112 KB Output is correct
56 Correct 1210 ms 193144 KB Output is correct
57 Correct 1250 ms 194820 KB Output is correct
58 Correct 13 ms 24012 KB Output is correct
59 Correct 14 ms 24012 KB Output is correct
60 Correct 14 ms 24084 KB Output is correct
61 Correct 1221 ms 195072 KB Output is correct
62 Correct 1252 ms 203220 KB Output is correct
63 Correct 1225 ms 197572 KB Output is correct
64 Correct 92 ms 42436 KB Output is correct
65 Correct 86 ms 42844 KB Output is correct
66 Correct 1204 ms 195040 KB Output is correct
67 Correct 1226 ms 194712 KB Output is correct
68 Correct 1105 ms 235460 KB Output is correct
69 Correct 1062 ms 235888 KB Output is correct
70 Correct 1100 ms 235220 KB Output is correct
71 Correct 1169 ms 235276 KB Output is correct
72 Correct 1106 ms 235120 KB Output is correct
73 Correct 1020 ms 236636 KB Output is correct
74 Correct 1085 ms 237380 KB Output is correct
75 Correct 1090 ms 237316 KB Output is correct
76 Correct 1078 ms 238052 KB Output is correct
77 Correct 1083 ms 236876 KB Output is correct
78 Correct 1105 ms 244792 KB Output is correct
79 Correct 1049 ms 244424 KB Output is correct
80 Correct 1004 ms 242888 KB Output is correct
81 Correct 985 ms 259476 KB Output is correct
82 Correct 1043 ms 260836 KB Output is correct
83 Correct 1012 ms 260804 KB Output is correct
84 Correct 1030 ms 271924 KB Output is correct
85 Correct 1069 ms 309800 KB Output is correct
86 Correct 1063 ms 308772 KB Output is correct
87 Correct 1071 ms 308884 KB Output is correct