参考博客

#include<cstdio>
typedef long long ll;
const int N = 2e5 + 50; int n, cnt, top, tot;
int c[N], mindiv[N], dep[N], w[N];
int head[N], sta[N], lca_dep[N];
ll minn, ans[N]; struct Edge{
int nex, to;
}e[N << 1]; inline int lowbit(int &x) { return x & -x; }
inline ll min(ll a, ll b) { return a < b ? a : b; }
inline void add(int a, int b) { e[++cnt] = {head[a], b}; head[a] = cnt; } void add(int x){
while(x <= n){
++c[x];
x += lowbit(x);
}
} int ask(int x){
int ans = 0;
while(x){
ans += c[x];
x -= lowbit(x);
}
return ans;
} void init(int n){
cnt = 0;
for(int i = 1; i <= n; ++i) c[i] = w[i] = dep[i] = lca_dep[i] = ans[i] = 0;
} void pre(int n){
for(int i = 2; i <= n; ++i)
for(int t = i; t <= n; t += i)
if(!mindiv[t]) mindiv[t] = i;
} void build(){
tot = n;
sta[top = 1] = 1, head[1] = 0;
for(int i = 2, t; i <= n; ++i){
t = i; dep[i] = dep[i - 1] + 1;
while(t != mindiv[t]) ++dep[i], t /= mindiv[t];
lca_dep[i] = ask(n) - ask(t - 1);
for(int t = i; t != 1; t /= mindiv[t]) add(mindiv[t]);
}
for(int i = 2; i <= n; ++i){
//printf("%d %d\n", lca_dep[i], sta[1]);
while(top > 1 && dep[sta[top - 1]] >= lca_dep[i]){
add(sta[top - 1], sta[top]);
--top;
}
if(dep[sta[top]] != lca_dep[i]){
dep[++tot] = lca_dep[i];
head[tot] = 0;
add(tot, sta[top]);
sta[top] = tot;
}
head[i] = 0, sta[++top] = i;
}
//printf("%d %d ", top, sta[1]);
for(int i = 1; i < top; ++i) add(sta[i], sta[i + 1]);
} void dfs(int u){
//printf("%d ", u);
ans[1] += 1LL * w[u] * dep[u];
for(int i = head[u]; i; i = e[i].nex){
int to = e[i].to;
dfs(to);
w[u] += w[to];
}
} void dfs2(int u){
for(int i = head[u]; i; i = e[i].nex){
int to = e[i].to;
ans[to] = ans[u] + (w[1] - 2LL * w[to]) * (dep[to] - dep[u]);
dfs2(to);
}
} int main(){
pre(1e5);
while(scanf("%d", &n) != EOF){
for(int i = 1; i <= n; ++i) scanf("%d", &w[i]);
minn = 1e15;
build();
dfs(1); dfs2(1);
for(int i = 1; i <= tot; ++i) minn = min(ans[i], minn);
printf("%lld\n", minn);
init(tot);
}
return 0;
}

2020牛客多校第一场B(虚树)的更多相关文章

  1. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  2. 牛客多校第一场 B Inergratiion

    牛客多校第一场 B Inergratiion 传送门:https://ac.nowcoder.com/acm/contest/881/B 题意: 给你一个 [求值为多少 题解: 根据线代的知识 我们可 ...

  3. 2019年牛客多校第一场B题Integration 数学

    2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...

  4. 2019牛客多校第一场E ABBA(DP)题解

    链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...

  5. 牛客多校第一场 A Equivalent Prefixes 单调栈(笛卡尔树)

    Equivalent Prefixes 单调栈(笛卡尔树) 题意: 给出两个数组u,v,每个数组都有n个不同的元素,RMQ(u,l,r)表示u数组中[l,r]区间里面的最小值标号是多少,求一个最大的m ...

  6. 2019牛客多校第一场A-Equivalent Prefixes

    Equivalent Prefixes 传送门 解题思路 先用单调栈求出两个序列中每一个数左边第一个小于自己的数的下标, 存入a[], b[].然后按照1~n的顺序循环,比较 a[i]和b[i]是否相 ...

  7. 2019年牛客多校第一场 I题Points Division 线段树+DP

    题目链接 传送门 题意 给你\(n\)个点,每个点的坐标为\((x_i,y_i)\),有两个权值\(a_i,b_i\). 现在要你将它分成\(\mathbb{A},\mathbb{B}\)两部分,使得 ...

  8. 2019年牛客多校第一场 H题XOR 线性基

    题目链接 传送门 题意 求\(n\)个数中子集内所有数异或为\(0\)的子集大小之和. 思路 对于子集大小我们不好维护,因此我们可以转换思路变成求每个数的贡献. 首先我们将所有数的线性基的基底\(b\ ...

  9. 2019牛客多校第一场 A.Equivalent Prefixes

    题目描述 Two arrays u and v each with m distinct elements are called equivalent if and only if RMQ(u,l,r ...

  10. 2019 牛客多校第一场 D Parity of Tuples

    题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...

随机推荐

  1. 快速解决 const 与 typedef 类型组合时 ,const修饰谁的问题

    C++使用typedef 给复合类型定义别名时,与const结合会产生看似"令人困惑"的类型推定,例如 typedef char* pstring; const pstring c ...

  2. 使用.NET Jieba.NET 的 PosSegmenter 实现中文分词匹配

    ​ 目录 引言 1. 什么是中文分词 2. Jieba.NET简介 3. PosSegmenter介绍 4. 实现中文分词匹配 4.1 安装Jieba.NET库 4.2 创建PosSegmenter实 ...

  3. Auto-GPT免费尝鲜之初体验-使用攻略和总结

    写在前面的废话 ChatGPT 的交互模式,是和一个 "人" 对话聊天. 如果你想了解更多ChatGPT和AI绘画的相关知识,请参考:ChatGPT注册和变现思路,AI绘画教程汇总 ...

  4. 带你上手基于Pytorch和Transformers的中文NLP训练框架

    本文分享自华为云社区<全套解决方案:基于pytorch.transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据>,作者: 汀丶 . 1.简介 目标: ...

  5. QEMU tap数据接收流程

    QEMU直接从tap/tun取数据 QEMU tap数据接收步骤: qemu从tun取数据包 qemu将数据包放入virtio硬件网卡. qemu触发中断. 虚拟机收到中断,从virtio读取数据. ...

  6. 了解API接口技术及其应用

    在当今数字化时代,API(Application Programming Interface,应用程序接口)已成为了各行各业之间数据传输和交互的关键技术.无论是电商平台.社交媒体.金融系统,还是智能设 ...

  7. 2017-A

    2017-A 题目描述: 输入一个字符串,要求输出能把所有的小写字符放前面,大写字符放中间,数字放后面,并且中间用空格隔开,如果同种类字符间有不同种类的字符,输出后也要用字符隔开. 例: 输入 12a ...

  8. Github的一个奇技淫巧

    背景 前段时间给 VictoriaLogs 提交了一个 PR: https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4934 本来一切都很顺 ...

  9. VScode+X11支持连接服务器时支持open3d、openCV、matplotlib等可视化

    背景 连接服务器以后,想用open3d可视化点云.matplotlib画点图,但是一直不能用,原因也很简单,就是没有配置GUI传输显示,那肯定是要配置X11相关的东西. 过程 服务器 确保服务器下载了 ...

  10. Semantic Kernel .NET SDK 的 v1.0.0 Beta1 发布

    介绍 Semantic Kernel (SK) 是一个开源的将大型语言模型(LLM)与流行的编程语言相结合的SDK,Microsoft将Semantic Kernel(简称SK)称为轻量级SDK,结合 ...