2020牛客多校第一场B(虚树)
#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(虚树)的更多相关文章
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- 牛客多校第一场 B Inergratiion
牛客多校第一场 B Inergratiion 传送门:https://ac.nowcoder.com/acm/contest/881/B 题意: 给你一个 [求值为多少 题解: 根据线代的知识 我们可 ...
- 2019年牛客多校第一场B题Integration 数学
2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...
- 2019牛客多校第一场E ABBA(DP)题解
链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...
- 牛客多校第一场 A Equivalent Prefixes 单调栈(笛卡尔树)
Equivalent Prefixes 单调栈(笛卡尔树) 题意: 给出两个数组u,v,每个数组都有n个不同的元素,RMQ(u,l,r)表示u数组中[l,r]区间里面的最小值标号是多少,求一个最大的m ...
- 2019牛客多校第一场A-Equivalent Prefixes
Equivalent Prefixes 传送门 解题思路 先用单调栈求出两个序列中每一个数左边第一个小于自己的数的下标, 存入a[], b[].然后按照1~n的顺序循环,比较 a[i]和b[i]是否相 ...
- 2019年牛客多校第一场 I题Points Division 线段树+DP
题目链接 传送门 题意 给你\(n\)个点,每个点的坐标为\((x_i,y_i)\),有两个权值\(a_i,b_i\). 现在要你将它分成\(\mathbb{A},\mathbb{B}\)两部分,使得 ...
- 2019年牛客多校第一场 H题XOR 线性基
题目链接 传送门 题意 求\(n\)个数中子集内所有数异或为\(0\)的子集大小之和. 思路 对于子集大小我们不好维护,因此我们可以转换思路变成求每个数的贡献. 首先我们将所有数的线性基的基底\(b\ ...
- 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 ...
- 2019 牛客多校第一场 D Parity of Tuples
题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...
随机推荐
- 树莓派烧录系统并在无外接屏幕的情况下连接VNC
上个月老板给了块树莓派3B,开心坏了,在咸鱼上掏了很多零件,花了一段时间做出了一个二驱动的智能小车,但是觉得小车太小,就在又在咸鱼上掏了个四区的地盘,但是在拆卸的过程中,发现树莓派WIFI没有了, ...
- C#程序变量统一管理例子 - 开源研究系列文章
今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子. 我们知道,在C#里使用变量,除了private私有变量外,程序中使用到的公共变量就需要进行统一的存放和管理.这里笔者使用到的公共变量管理库 ...
- 7、Mybatis之特殊SQL
7.1 创建接口.映射文件和测试类 ++++++++++++++++++++++++++分割线++++++++++++++++++++++++++ 注意namespace属性值为对应接口的全限定类名 ...
- cockpit--一款开源的适用于单主机的Linux监控面板
在搜索Linux监控时,偶然发现一款还不错的监控面板,该面板为red hat开发,适用于各种Linux发行版,部署也非常方便,官方文档Running Cockpit - Cockpit Project ...
- 【LaTeX】语法(更新中)
目录 长度 空行 空格 超链接 数学公式 段落中(隐式) 单独成段(显式) 居中,左对齐,右对齐 居中 左对齐 右对齐 参考文献配置 TODO 参考资料 中文支持参考环境配置中的 内容,在这里不做重复 ...
- 如何修改min.js或者压缩后的js,以便提高代码的可读性。
前端的js上线的时候一般会使用打包工具处理(webpack,gulp,ugly.js 等).这样做有几点作用. 可以压缩空间,提高页面响应速度 一定程度上可以保护自己的代码安全,防止别人清晰看懂逻辑或 ...
- 一次性全讲透GaussDB(DWS)锁的问题
本文分享自华为云社区<GaussDB(DWS)锁问题全解>,作者: yd_211043076. 一.gaussdb有哪些锁 1.常规锁:常规锁主要用于业务访问数据库对象的加锁,保护并发操作 ...
- 国庆微信头像DIY:轻松打造个性化头像
前言 国庆节马上要到了,今天就教你如何从0到1使用canvas生成国庆风微信头像. 本文包含以下内容: vue3项目搭建,需求分析 canvas合成图片原理 github自动化部署 开发过程遇到的问题 ...
- 8. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP改造篇之HPACK原理
用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP改造篇之HPACK原理 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy ...
- Kubeflow基础知识
kubeflow 基础知识 kubeflow 简介 kubeflow是谷歌开源的MLOps开源平台,其中包含的不同组件代表了机器学习生命周期的不同阶段. 下图是kubeflow组织ML工作流程: ku ...