Wannafly Camp 2020 Day 2E 阔力梯的树 - set,启发式合并

搞一波启发式合并即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define iter set<long long>::iterator
const int N = 100005;
struct myset {
set <int> s;
int ans = 0;
void insert(int x) {
iter p = s.insert(x).first;
iter rb = s.end();
--rb;
if(p!=s.begin() && p!=rb) {
iter pre=p, suf=p;
--pre; ++suf;
ans += x*x*2;
ans += (*pre) * (*suf) * 2;
ans -= x * ((*pre) + (*suf)) * 2;
}
if(p!=s.begin() && p==rb) {
iter pre=p;
--pre;
ans += x*x + (*pre)*(*pre) - 2*x*(*pre);
}
if(p==s.begin() && p!=rb) {
iter suf=p;
++suf;
ans += x*x + (*suf)*(*suf) - 2*x*(*suf);
}
}
void merge(myset *ms) {
for(iter it=ms->s.begin();it!=ms->s.end();it++) {
insert(*it);
}
}
void print() {
for(iter it=s.begin();it!=s.end();it++)
cout<<(*it)<<" ";
}
} buf[N];
myset* merge(myset *s1,myset *s2) {
if(s1->s.size() < s2->s.size()) {
s2->merge(s1);
return s2;
}
else {
s1->merge(s2);
return s1;
}
}
int n,p[N],vis[N],ans[N];
myset *s[N];
vector <int> g[N];
void print() {
for(int i=1;i<=n;i++) {
cout<<"Node "<<i<<": ";
s[i]->print();
cout<<endl;
}
}
void dfs(int p) {
vis[p]=1;
for(int i=0;i<g[p].size();i++) {
int q=g[p][i];
if(vis[q]) continue;
dfs(q);
s[p]=merge(s[p],s[q]);
}
ans[p]=s[p]->ans;
}
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) {
s[i]=&buf[i];
s[i]->insert(i);
}
for(int i=2;i<=n;i++) {
cin>>p[i];
g[p[i]].push_back(i);
g[i].push_back(p[i]);
}
dfs(1);
for(int i=1;i<=n;i++) {
cout<<ans[i]<<endl;
}
}
Wannafly Camp 2020 Day 2E 阔力梯的树 - set,启发式合并的更多相关文章
- E、阔力梯的树
题:https://ac.nowcoder.com/acm/contest/4010/E?&headNav=acm 分析:dsu.贪心方法:考虑插入一个值x,对总体贡献,若查找在序列中左边有值 ...
- Wannafly Camp 2020 Day 3I N门问题 - 概率论,扩展中国剩余定理
有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人 ...
- Wannafly Camp 2020 Day 3F 社团管理 - 决策单调性dp,整体二分
有 \(n\) 个数构成的序列 \({a_i}\),要将它划分为 \(k\) 段,定义每一段的权值为这段中 \((i,j) \ s.t. \ i<j,\ a_i=a_j\) 的个数,求一种划分方 ...
- Wannafly Camp 2020 Day 3D 求和 - 莫比乌斯反演,整除分块,STL,杜教筛
杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\fra ...
- Wannafly Camp 2020 Day 2B 萨博的方程式 - 数位dp
给定 \(n\) 个数 \(m_i\),求 \((x_1,x_2,...,x_n)\) 的个数,使得 \(x_1 \ xor\ x_2\ xor\ ...\ xor\ x_n = k\),且 \(0 ...
- Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机
动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...
- Wannafly Camp 2020 Day 1D 生成树 - 矩阵树定理,高斯消元
给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成 ...
- Wannafly Camp 2020 Day 2I 堡堡的宝藏 - 费用流
感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memse ...
- Wannafly Camp 2020 Day 2J 邦邦的2-SAT模板
#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; cout<<n& ...
随机推荐
- Windows10官方原版系统下载安装制作方法
Windows10官方原版系统下载安装制作方法 去官网下载系统安装程序 点进去 https://www.microsoft.com/zh-cn/software-download/windows10 ...
- PHP0025:PHP 博客项目开发2
- R语言常用的矩阵操作
R语言是一门非常方便的数据分析语言,它内置了许多处理矩阵的方法.下面列出一些常用的矩阵操作方法示例. 矩阵的生成 > mat <- matrix(:, ncol = , nrow = , ...
- linux 开机自启动redis服务
[Unit] Description=The redis-server Process Manager Documentation=https://redis.io/ After=network.ta ...
- Docker 网络原理
引言 学习docker网络,可以带着下面两个问题来探讨 容器之间可以相互访问的原理 容器暴露端口后,通过宿主机访问到容器内应用,并且对于访问端而言不用感知容器存在的原理 Docker 本身的技术依赖L ...
- Linux.CentOS下载
1.[CentOS]centos7 稳定使用版本,centos镜像的下载 - Angel挤一挤 - 博客园.html(https://www.cnblogs.com/sxdcgaq8080/p/106 ...
- 退役记——CCC2020&CCO2020
我叫吴佳诚,一个曾在福建师大附中就读的oier,2019年7月份我来到多伦多就读于Langstaff Secondary School 我的常用id有:Johnson_Wu,温词 竞赛经历: 2018 ...
- thinkPHP5.1模型User设计
创建一个User类,再引入think\Model,让User类继承Model 例: <?php namespace app\index\model; use think\Model; class ...
- [Linux] git add时的注意事项
git add -A 提交所有变化 git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) git add . 提交新文件(new)和被修改( ...
- ural 2124
题意 ural 做法 求出一个原根\(\omega\),对于每个数\(x\)写成\(x=\omega^{k}\)的形式,\(\delta(x)=\frac{p-1}{k}\) 我们不关心群具体的东西, ...