CF1806E
看起来是个 DS 题,事实上是个乱搞题,做法挺多的。由于它给的这个结构看起来就不好优化,所以考虑随机化。
由于两个点到达 LCA 后剩下的贡献就是 LCA 到根的每个点权值的平方,这部分可以
在树上随机撒
对于一个询问
代码:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define endl '\n'
#define rep(i, s, e) for(int i = s, i##E = e; i <= i##E; ++i)
#define per(i, s, e) for(int i = s, i##E = e; i >= i##E; --i)
#define F first
#define S second
#define int ll
#define gmin(x, y) ((x > y) && (x = y))
#define gmax(x, y) ((x < y) && (x = y))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
constexpr int N = 1e5 + 5, B = 350;
int n, q, a[N], s[N], f[N], dep[N], id[N], st[B], dis[B][B];
vector<int> to[N];
mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count());
void dfs1(int p) {
dep[p] = dep[f[p]] + 1;
s[p] = a[p] * a[p] + s[f[p]];
for(auto i : to[p]) dfs1(i);
}
signed main() {
#ifdef ONLINE_JUDGE
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
#endif
cin >> n >> q;
rep(i, 1, n) cin >> a[i];
rep(i, 2, n) {
cin >> f[i];
to[f[i]].push_back(i);
}
dfs1(1);
uniform_int_distribution<> rnd(1, n);
int num = sqrt(n);
rep(i, 1, num) {
int t = rnd(gen);
st[i] = t;
id[t] = i;
}
rep(i, 1, num) {
dis[i][i] = s[i];
rep(j, i + 1, num) {
int u = st[i], v = st[j], res = 0;
if(dep[u] < dep[v]) swap(u, v);
while(dep[u] > dep[v]) u = f[u];
while(u != v) {
res += a[u] * a[v];
u = f[u], v = f[v];
}
dis[i][j] = dis[j][i] = res + s[u];
}
}
while(q--) {
int u, v; cin >> u >> v;
int fu = 0, fv = 0, res = 0;
while((!fu || !fv) && u != v) {
if(id[u]) fu = id[u];
if(id[v]) fv = id[v];
if(!fu || !fv) res += a[u] * a[v];
u = f[u], v = f[v];
}
if(fu && fv) {
cout << res + dis[fu][fv] << endl;
}
else cout << res + s[u] << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构