5289: [Hnoi2018]排列

链接

分析:

  首先将题意转化一下:每个点向a[i]连一条边,构成了一个以0为根节点的树,要求选一个拓扑序,点x是拓扑序中的第i个,那么价值是i*w[x]。让价值最大。

  然后贪心:直观的考虑,应该让权值小的尽量靠前,那么依次考虑当前最小的权值,一旦选了它的父节点,那么下一个就会选它。将它和父节点合并,新的权值为平均数,并且记录下siz。推广一下即每次选平均数最小的集合,和父节点所在的集合合并。

  证明:如果当前有两个集合x,y,如果x在前面更优,那么$w[x] + w[y] \times siz[x] > w[y] + w[x] \times siz[y]$

$w[x] \times (siz[y] - 1) < w[y] \times (siz[x] - 1 ) $

$\frac{w[x]}{siz[x] - 1} < \frac{w[y]}{siz[y] - 1}$

所以x在y前面的条件是平均数小,那么就可以用堆来维护了。注意一下如果平均数比较的话,要开long double,或者直接按照上面的第二个式子来比较,不存在精度问题。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} #define pa pair<long double,int>
const int N = ;
int fa[N], a[N], siz[N];
LL w[N]; struct Heap{
priority_queue< pa, vector< pa >, greater< pa > > a, b;
void Insert(pa x) { a.push(x); }
void Delete(pa x) { b.push(x); }
pa Top() {
while (!b.empty() && a.top() == b.top()) a.pop(), b.pop();
return a.top();
}
}q;
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
int main() {
int n = read();
for (int i = ; i <= n; ++i) fa[i] = i;
for (int i = ; i <= n; ++i) {
a[i] = read();
int u = find(a[i]), v = find(i);
if (u != v) fa[u] = v;
else { puts("-1"); return ; }
}
LL ans = ;
for (int i = ; i <= n; ++i) fa[i] = i;
for (int i = ; i <= n; ++i) {
w[i] = read(); siz[i] = ; ans += w[i];
q.Insert(pa(w[i], i));
}
for (int k = ; k <= n; ++k) {
pa now = q.Top(); q.Delete(now);
int x = now.second, y = find(a[x]);
if (y) q.Delete(pa((long double)w[y] / siz[y], y));
ans += 1ll * siz[y] * w[x];
w[y] += w[x]; siz[y] += siz[x]; fa[x] = y;
if (y) q.Insert(pa((long double)w[y] / siz[y], y));
}
cout << ans;
return ;
}

5289: [Hnoi2018]排列的更多相关文章

  1. bzoj 5289: [Hnoi2018]排列

    Description Solution 首先注意到实际上约束关系构成了一棵树 考虑这个排列 \(p\),编号为 \(a[i]\) 的出现了,\(i\) 才可以出现 那么如果连边 \((a[i],i) ...

  2. 【BZOJ5289】[HNOI2018]排列(贪心)

    [BZOJ5289][HNOI2018]排列(贪心) 题面 BZOJ 洛谷 题解 这个限制看起来不知道在干什么,其实就是找到所有排列\(p\)中,\(p_k=x\),那么\(k<j\),其中\( ...

  3. BZOJ.5289.[AHOI/HNOI2018]排列(贪心 heap)

    BZOJ LOJ 洛谷 \(Kelin\)写的挺清楚的... 要求如果\(a_{p_j}=p_k\),\(k\lt j\),可以理解为\(k\)要在\(j\)之前选. 那么对于给定的\(a_j=k\) ...

  4. [HNOI2018]排列

    Description: 给定 \(n\) 个整数 \(a_1, a_2, \dots, a_n, 0 \le a_i \le n\),以及 \(n\) 个整数 \(w_1, w_2, \dots, ...

  5. [HNOI2018]排列[堆]

    题意 给定一棵树,每个点有点权,第 \(i\) 个点被删除的代价为 \(w_{p[i]}\times i\) ,问最小代价是多少. 分析 与国王游戏一题类似. 容易发现权值最小的点在其父亲选择后就会立 ...

  6. BZOJ5289: [Hnoi2018]排列

    传送门 第一步转化,令 \(q[p[i]]=i\),那么题目变成: 有一些 \(q[a[i]]<q[i]\) 的限制,\(q\) 必须为排列,求 \(max(\sum_{i=1}^{n}w[i] ...

  7. BZOJ5289:[HNOI2018]排列

    我对贪心的理解:https://www.cnblogs.com/AKMer/p/9776293.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  8. loj2509 hnoi2018排列

    题意:对于a数组,求它的一个合法排列的最大权值.合法排列:对于任意j,k,如果a[p[j]]=p[k],那么k<j. 权值:sigma(a[p[i]]*i).n<=50W. 标程: #in ...

  9. 【比赛】HNOI2018 排列

    这题原题... 这题题面七绕八绕,有点麻烦,反正最后转化就是一棵树,每个点有一个值,要把所有点选完,要求选择一个点必须是它的父亲和祖先已经全部被选了,贡献是这个点的权值乘上它被选择的排名 如果一个点是 ...

随机推荐

  1. 关于Vue中:key="index"的console警告

    在写vue项目时,浏览器的console出现如下警告信息: [Vue warn]: Property or method "index" is not defined on the ...

  2. idea常用到的命令

    idea大小写转换:ctr+shift+u ctrl+alt+b,跳转到接口的方法实现处

  3. ARC下block使用情况

    ARC与MRC的block有着一些区别,笔记整理ARC的block,仅仅是自己参考的笔记,详情请参考 http://www.cnbluebox.com/?p=255 在开始之前,请新建一个Model类 ...

  4. Linux 系统开机自启的配置文件

    程序开机启动的配置文件(/etc/rc.local) # 系统级别 ntsysv # 图形界面设置自启程序 chkconfig(/etc/init.d/sshd) 处理开机启动的文件 # 用户级别 # ...

  5. 17 汽车服务工程 李腾飞 Excel 课程表

  6. 铁乐学python_day29_模块与包学习4

    大部份内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/ 编译python文件 编译python文件是为了提高加载模块的速度,强调强调强调:提高的是加载速度而绝非运行速度 ...

  7. Asp.net Core相关教程及开源项目推荐

    入门 全新的ASP.NET:  https://www.cnblogs.com/Leo_wl/p/5654828.html 在IIS上部署你的ASP.NET Core项目: https://www.c ...

  8. n = 3 , while n , continue

  9. MapReduce实例2(自定义compare、partition)& shuffle机制

    MapReduce实例2(自定义compare.partition)& shuffle机制 实例:统计流量 有一份流量数据,结构是:时间戳.手机号.....上行流量.下行流量,需求是统计每个用 ...

  10. HAproxy.md

    HAProxy HAProxy是什么 HAProxy(High Available Proxy)是基于四层和七层的高可用负载均衡代理服务器,配置简单.支持多达上万条并发请求. HAProxy工作原理 ...