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 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...
随机推荐
- [minio]简介与安装
简介 MinIO是一款高性能的分布式对象存储系统. 官网地址 特性 轻便 高性能 跨平台 高扩展性 云原生支持 兼容Amazon S3 基本概念 s3:simple storage service,简 ...
- 《CUDA编程:基础与实践》读书笔记(1):CUDA编程基础
1. GPU简介 GPU与CPU的主要区别在于: CPU拥有少数几个快速的计算核心,而GPU拥有成百上千个不那么快速的计算核心. CPU中有更多的晶体管用于数据缓存和流程控制,而GPU中有更多的晶体管 ...
- cs50ai1
cs50ai1-------Knowledge cs50ai1-------Knowledge 基础知识 课后题目 代码实践 学习链接 总结 基础知识 对我们来说,一些基本的logic是自然而然的,我 ...
- Midjourney的一些学习心得:如何高效的图生图
注意本文没有什么长篇大论,全部是自己的学习心得. 心得体会:如何图生图 今天在一篇midjourney看到好图应该怎么抄. 相信经常会看到好图也想要的,但是要么抄不出感觉,要么抄过来把水印也抄了,这一 ...
- 《SQL与数据库基础》06. 函数
目录 函数 字符串函数 数值函数 日期函数 流程函数 本文以 MySQL 为例 函数 函数是指一段可以直接被另一段程序调用的程序或代码. 要查看函数操作的结果,可以使用 SELECT 函数(参数); ...
- ATtiny88初体验(六):SPI
ATtiny88初体验(六):SPI SPI介绍 ATtiny88自带SPI模块,可以实现数据的全双工三线同步传输.它支持主从两种模式,可以配置为LSB或者MSB优先传输,有7种可编程速率,支持从空闲 ...
- ios添加库文件
- 「loj - 3489」「joisc 2021 day 1」Food Court
link. 感觉好久没写过题解了, 这就是永远在骚动的得不到吧. 星尘 infinity 真的非常行, 就算是 ja voicebase 都不知道吊打那群日 v 多少圈. 我推荐你们都去听一听. ch ...
- 树莓派3B/3B+的串口使用
树莓派包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0).硬件串口由硬件实现,有单独的波特率时钟源,性能高.可靠.mini串口时钟源是由CPU ...
- Docker系列——介绍、安装、镜像、容器、docker容器与镜像、数据卷、Dockerfile、docker 配置pycharm连接
目录 1 Docker 介绍 1.1 简介 1.2 Docker平台介绍 1.3 为什么使用Docker 2 Docker 整体结构(了解) 2.1 Docker引擎介绍 (Docker Engine ...