题解:P17851 「RiOI-(-2)」houran 和芒果 / [ROI 2026 Day1] 泰莫利亚的调查 加强版
lovely_nst · · 题解
题意是将以
先看一个弱化版,选
为什么是对的?一个以
u 为根的长链一定比以son_{fa_u} 为根的长链更短,也就是后者一定更优。
回到本题,考虑将原问题转化。对于点
例如当
由于需要大量复杂卡常,这里给出可读性高的未卡常代码。
:::success[Code]
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 4e5 + 5 , V = 1 << 18;
vector <int> c[V] , g[N] , G[N];
int n , k , x[4] , fa[N] , d[N] , W[N] , w[N] , son[N] , S[N] , idx;
int cnt[V] , tmp[N];
void Dfs (int u)
{
son[u] = 0;
for (int v : G[u])
{
Dfs (v);
if (d[son[u]] <= d[v]) son[u] = v;
}
for (int v : G[u]) if (v != son[u])
S[++ idx] = d[v];
d[u] = d[son[u]] + w[u];
}
signed main ()
{
ios::sync_with_stdio (0);
cin.tie (0) , cout.tie (0);
cin >> n;
for (int i = 2;i <= n;i ++) cin >> fa[i];
for (int i = 2;i <= n;i ++) cin >> W[i];
int T;
cin >> T;
while (T --)
{
cin >> x[0] >> x[1] >> x[2] >> x[3] >> k;
for (int i = 0;i < V;i ++) c[i].clear ();
for (int i = 1;i <= n;i ++) g[i].clear ();
for (int i = 1;i <= (n << 1);i ++) G[i].clear () , d[i] = 0;
for (int i = 2;i <= n;i ++) w[i] = W[i] ^ x[i & 3] , c[w[i]].push_back (i);
for (int i = 0;i < V;i ++)
for (int v : c[i])
g[fa[v]].push_back (v);
int cc = n;
for (int i = 1;i <= n;i ++)
{
int lst = i , lstw = 0;
for (int v : g[i])
{
cc ++;
G[lst].push_back (cc);
G[cc].push_back (v);
w[cc] = w[v] - lstw;
lstw = w[v] , lst = cc;
w[v] = 0;
}
}
idx = 0;
Dfs (1);
S[++ idx] = d[1];
nth_element (S + 1 , S + idx - k , S + idx + 1);
int ans = 0;
k = min (k , idx);
for (int i = idx - k + 1;i <= idx;i ++) ans += S[i];
cout << ans << '\n';
}
return 0;
}
:::