int n, m, q; ll d[maxn]; ll dis[maxn][20]; vector<pair<int, ll> > G[maxn];
voidinit(int u){ if (u > n) return; d[u] = 1e16; init(u << 1); init(u << 1 | 1); }
voiddfs(int u, int dep = 0){ if (u > n) return; dis[u][dep] = d[u]; dfs(u << 1, dep + 1); dfs(u << 1 | 1, dep + 1); }
voidDij(int s){ init(s); priority_queue<pair<ll, int>> Q; Q.emplace(0, s); d[s] = 0; while (Q.size()) { auto [dist, u] = Q.top(); Q.pop(); dist = -dist; if (d[u] < dist) continue; for (auto [v, w] : G[u]) { if (s <= v && d[v] > d[u] + w) { d[v] = d[u] + w; Q.emplace(-d[v], v); } } } dfs(s); }
intgao(int x){ return x ? gao(x / 2) + 1 : 0; }
voidrun(){ int u, v; scanf("%d%d", &u, &v); int x = gao(u) - 1; int y = gao(v) - 1; ll ans = 1e16; for (; x >= 0 && y >= 0; --x, --y) { if ((u >> x & 1) ^ (v >> y & 1)) break; ans = min(ans, dis[u][x] + dis[v][y]); } if (ans > 1e16 / 2) ans = -1; printf("%lld\n", ans); }
intmain(){ scanf("%d%d", &n, &m); for (int i = 1; i <= m; ++i) { int u, v, w; scanf("%d%d%d", &u, &v, &w); G[u].emplace_back(v, w); G[v].emplace_back(u, w); } for (int i = 1; i <= n; ++i) Dij(i); scanf("%d", &q); while (q--) run(); return0; }
voidrun(){ scanf("%lld %lld", &n, &m); if (n >= m) { printf("%lld\n", n - m); return; } if (m % n == 0) { puts("0"); return; } ll ans = n - 1; for(ll l = 2, r; l <= m; l = r + 1) { r = m / (m / l); r = min(r, n); ll tmp = n - r; ll mul = 1; mul = (m + r - 1) / r; ll a = (r * mul - m) / mul; ll b = (r * mul - m) % mul; ans = min(ans, tmp + a + b); if(r == n) break; } printf("%lld\n", ans); }
intmain(){ int t = 1; scanf("%d", &t); while (t--) run(); return0; }
voidun(int a, int b){ int sa = find(a), sb = find(b); if (sa != sb) {
num[sa] += num[sb]; num[sb] = 0;
del[sa] += del[sb]; del[sb] = 0;
s[sb] = sa; }
del[sa] += 1; }
boolin(ll tmp, int tt){ int u = lower_bound(b + 1, b + 1 + q, tmp) - b; if (u > q) returnfalse; if (b[u] != tmp) returnfalse; if (ds[u] > tt) returnfalse; returntrue; }
int cnt, head[maxn]; structedge {int v, next; } e[maxn << 1]; voidadd(int u, int v){ e[++cnt] = {v, head[u]}; head[u] = cnt; e[++cnt] = {u, head[v]}; head[v] = cnt; }
int vis[maxn]; int dis[maxn]; int val[maxn << 1]; voidBFS(){ queue<int> Q; Q.push(1); vis[1] = 1; while (Q.size()) { int u = Q.front(); Q.pop(); for (int i = head[u]; i; i = e[i].next) { int v = e[i].v; if (vis[v]) continue; vis[v] = 1; dis[v] = dis[u] + 1; if (val[dis[v] * 2] < a[v]) val[dis[v] * 2] = a[v]; Q.push(v); } } }
int dp[maxn]; int v[maxn << 1]; int w[maxn << 1];
voidrun(){ scanf("%d%d%d", &n, &m, &q); for (int i = 2; i <= n; ++i) scanf("%d", a + i); for (int i = 1; i <= m; ++i) { int u, v; scanf("%d%d", &u, &v); add(u, v); } BFS(); int tot = 0; for (int i = 1; i <= n << 1; ++i) { // printf("%d\n", val[i]); if (val[i]) { ++tot; v[tot] = i; w[tot] = val[i]; } } dp[0] = 0; for (int i = 1; i <= tot; ++i) { for (int j = v[i]; j <= q; ++j) { dp[j] = max(dp[j], dp[j - v[i]] + w[i]); } } int ans = 0; for (int i = 1; i <= q; ++i) { ans = max(ans, dp[i]); printf("%d ", ans); } }
intmain(){ int t = 1; // scanf("%d", &t); while (t--) run(); return0; }
M - Game Theory
solved by Tryna.0:40(+)
题解: 签到题,答案样例都给出来了。
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<bits/stdc++.h>
usingnamespacestd; typedeflonglong ll;
constint maxn = 1e5 + 7;
voidrun(){ int n; scanf("%d", &n); puts("0.0000"); }
intmain(){ int t = 1; // scanf("%d", &t); while (t--) run(); return0; }