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& ...
随机推荐
- C#模拟POST上传文件帮助类(支持https、http)
public static int PostFile(string getUrl, CookieContainer cookieContainer, HttpHeader header, string ...
- 0x01 C语言-编写第一个hello world
学习每一个编程语言都是从 "Hello world!" 开始的,这好像就是编程界一条不成文的规定一样. 在这篇文章中,我将教大家编写一个可以输出 "Hello world ...
- MFC/QT 学习笔记(四)——MFC基于对话框学习控件(上)
新建项目->MFC模板->MFC应用程序->应用程序类型:基于对话框->...OK 解决方案资源管理器->资源文件->xxx.rc->进入:资源视图-> ...
- 【转载】ibit-mybatis介绍
原文链接:ibit-mybatis介绍 概述 ibit-mybatis是一个Mybatis的增强工具,在Mybatis的基础上增加了新的特性与功能,志在简化开发流程.提高开发效率. 特性 无侵入 ...
- Android实战项目——家庭记账本(六)
今天完成的主要任务如下: 1.设置页功能的布局 2.云服务器的部署 3.成功将一个本地Javaweb项目部署到阿里云 没什么特别说明的,直接上图: 首先是侧边栏功能的布局: ...
- redis学习三连奏,绝对让你彻底吃透分布式架构精髓
2020年初,远程办公与直播授课成为国民刚需,腾讯因此免费开放可支持300人同时在线会议的“腾讯会议”.一时之间,这款软件的用户呈爆发性增长,据统计,腾讯会议一天就有近较100倍日常的会议数量. 谈及 ...
- switch 语句 总结笔记
1.switch 语句 语法: switch(expression) { case value1 : statement1; break; case value2 : statement2; brea ...
- HTML5基础-新增标签+新增属性+布局案例
html5中常用的结构标签 article 文章 header 头部 nav 导航 section 区域 aside 侧边栏 hgroup 区块的相关信息 figure 定义一组内容及标题 figca ...
- 开始Python之旅
2019/11/22,今天是个好日子!非常高兴笔者的博客申请得到通过,让本人有幸成为博客园的一份子! 本人是一枚自然语言处理的爱好者,所用到的语言工具就是python,因此笔者的博客内容主要关乎pyt ...
- c#---out参数
一个方法有多个返回值时,返回值类型相同可以返回一个数组 static void Main(string[] args) { , , , , , , , , , }; int[] result = Ge ...