CE 求助
查看原帖
CE 求助
657750
qkhm楼主2025/7/20 11:26

不会交互题格式


#include <bits/stdc++.h>

#define lep(i, a, b) for (int i = a; i <= b; ++i)
#define rep(i, a, b) for (int i = a; i >= b; --i)
#define ep(i, u, v, w) for (int i = H[u], v = e[i].v, w = e[i].w; i; i = e[i].n, v = e[i].v, w = e[i].w)

const int _ = 2e5 + 7;
typedef long long ll;
typedef std::pair<ll, ll> PLL;
const ll inf = 4e18;

struct edge { int v, n, w; }e[_ << 1]; int H[_], cnte = 1;
int n, pr[_], dep[_], dfn[_], idx, fa[_], st[_][21], lg[_], id[_]; 
ll a[_], b[_], len[_], dp[_];
int sz[_], tmp[_], rt; bool vis[_];
std::vector <int> stk[_];
std::vector <ll> ans;

void Add(int u, int v, int w) { e[++cnte] = { v, H[u], w }, H[u] = cnte; }
void getrt(int u, int f, int total) {
	sz[u] = 1, tmp[u] = 0;
	ep(i, u, v, w) if (!vis[v] and v != f)
		getrt(v, u, total), sz[u] += sz[v], tmp[u] = std::max(tmp[u], sz[v]);
	tmp[u] = std::max(tmp[u], total - sz[u]);
	if (!rt or tmp[u] < tmp[rt]) rt = u;
}
int solve(int u, int total) {
	rt = 0, getrt(u, 0, total), vis[rt] = true; int t = rt;
	ep(i, t, v, w) if (!vis[v]) pr[solve(v, total - tmp[v])] = t;
	return t;
}
void init(int u, int f, ll d) {
	len[u] = d, dep[u] = dep[fa[u] = f] + 1, dfn[u] = ++idx, st[idx][0] = u;
	ep(i, u, v, w) if (v != f) init(v, u, d + w);
}
int upd(int x, int y) { return dep[x] < dep[y] ? x : y; }
void Init() {
	init(1, 0, 0), solve(1, n);
	lep(j, 1, 20) lep(i, 1, n - (1 << j) + 1)
		st[i][j] = upd(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
	lep(i, 2, n) lg[i] = lg[i >> 1] + 1;
}
int lca(int x, int y) {
	if (dfn[x] > dfn[y]) std::swap(x, y);
	int k = lg[dfn[y] - dfn[x] + 1], p = upd(st[dfn[x]][k], st[dfn[y] - (1 << k) + 1][k]);
	return p == x ? x : fa[p];
}
ll Dis(int x, int y) { return len[x] - 2 * len[lca(x, y)] + len[y]; }
#define sz stk[x].size()
ll X(int u) { return -b[u]; }
ll Y(int x, int u) { return dp[u] + a[u] + b[u] * Dis(x, u); }
PLL mv(int x, int y, int p) { return { X(y) - X(x), Y(p, y) - Y(p, x) }; }
ll xr(PLL x, PLL y) { return x.first * y.second - x.second * y.first; }
bool ck(int x, int y, ll k, int p) { return xr({1, k}, mv(x, y, p)) >= 0; }
ll Calc(int x, int u) {
	if (sz == 0) return inf;
	int l = 0, r = sz - 1; ll k = Dis(x, u);
	while (l < r) {
		int md = (l + r) >> 1;
		if (ck(stk[x][md], stk[x][md + 1], k, x)) r = md;
		else l = md + 1;
	}
	return -X(stk[x][l]) * k + Y(x, stk[x][l]);
}
bool chk(int x, int y, int p) { if (X(x) == X(y) and Y(p, y) >= Y(p, x)) return true; return false; }
void Ins(int x, int u) {
	if (dp[u] == inf) return;
	if (sz and chk(stk[x].back(), u, x)) return;
	while (sz > 1 and xr(mv(stk[x][sz - 2], stk[x][sz - 1], x), mv(stk[x][sz - 1], u, x)) <= 0) stk[x].pop_back();
	stk[x].push_back(u);
}
#undef sz

std::vector<long long> travel(std::vector<long long> A, std::vector<int> B, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
	n = A.size(); int u, v, w;
	lep(i, 1, n) a[i] = A[i - 1], id[i] = i;
	lep(i, 1, n) b[i] = B[i - 1], dp[i] = inf;
	dp[1] = 0;
	lep(i, 0, n - 2) u = U[i], v = V[i], w = W[i],
		++u, ++v, Add(u, v, w), Add(v, u, w);
	Init();
	std::sort(id + 1, id + 1 + n, [](const int&x, const int&y) { return b[x] > b[y]; });
	lep(j, 1, n) { int u = id[j], x = u;
		while (x) dp[u] = std::min(dp[u], Calc(x, u)), x = pr[x];
		x = u;
		while (x) Ins(x, u), x = pr[x];
	}
	lep(j, 1, n) { int u = id[j], x = u;
		while (x) dp[u] = std::min(dp[u], Calc(x, u)), x = pr[x];
	}

	lep(i, 2, n) ans.push_back(dp[i]);
	return ans;
}

2025/7/20 11:26
加载中...