博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷 P4437】 [HNOI/AHOI2018]排列(贪心,堆)
阅读量:6335 次
发布时间:2019-06-22

本文共 2033 字,大约阅读时间需要 6 分钟。

如果\(j<=k,a_{p[j]}!=p[k]\)可以理解为如果\(a_{p[j]}=p[k]\),那么\(k\)一定要放在\(j\)前面,也就是\(a_j\)\(j\)前面。
于是连边\((a[j],j)\),表示\(a[j]\)\(j\)前面,如果有环就是无解,如果没有环那么一定是一棵以\(0\)为根的树
根据题意,我们肯定是要尽量把\(w\)小的安排在前面。
于是考虑这样一个贪心:
对于当前最小\(w_i\)
如果\(fa[i]=0\),那么肯定直接选\(i\)
如果\(fa[i]!=0\),那么当选完\(fa[i]\)后肯定马上选\(i\)
于是就可以把\(fa[i]\)\(i\)合并了。
合并了以后显然不能按权值和排序,而要按权值的平均值。
维护当前最小可以用堆,
但合并后要修改权值,可以用平板电视的带修改堆,或者标记一下有没有被合并。
统计答案类似秦九韶定理。

#include 
#include
using namespace std;inline int read(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * w;}const int MAXN = 500010;struct Edge{ int next, to;}e[MAXN];int head[MAXN], num;inline void Add(int from, int to){ e[++num].to = to; e[num].next = head[from]; head[from] = num;}struct node{ int size, id; long long val; int operator > (const node A) const{ return val * A.size > A.val * size; }}now;int n, p;long long ans;int vis[MAXN], f[MAXN], size[MAXN], fa[MAXN];long long w[MAXN];priority_queue
, greater
> q;int dfs(int u){ vis[u] = 1; for(int i = head[u]; i; i = e[i].next) if(vis[e[i].to]) return 1; else if(dfs(e[i].to)) return 1; return 0;}int find(int x){ return f[x] == x ? x : f[x] = find(f[x]);}int main(){ n = read(); size[0] = 1; for(int i = 1; i <= n; ++i) Add(fa[i] = read(), f[i] = i); if(!head[0] || dfs(0)){ printf("-1"); return 0; } for(int i = 1; i <= n; ++i){ w[i] = read(); q.push( (node){ size[i] = 1, i, w[i] } ); } while(q.size()){ now = q.top(); q.pop(); if(size[now.id] ^ now.size) continue; f[now.id] = p = find(fa[now.id]); ans += w[now.id] * size[p]; size[p] += size[now.id]; w[p] += w[now.id]; if(p) q.push((node){ size[p], p, w[p] }); } printf("%lld\n", ans); return 0;}

转载于:https://www.cnblogs.com/Qihoo360/p/10382313.html

你可能感兴趣的文章
Fragment 之 PagerAdapter
查看>>
栈的存储结构的实现(C/C++实现)
查看>>
JS和DOM的关系
查看>>
50.10. 事件调度器(EVENT)
查看>>
工作周记 - 第三周 (2016/06/06 - 2016/06/8) 端午快乐
查看>>
软链接和硬链接的理解
查看>>
[LeetCode] Task Scheduler 任务行程表
查看>>
11.13. reload
查看>>
24.2. Styles
查看>>
第 7 章 SQL
查看>>
OK335xS U-boot 编译问题&无Linux shell 问题
查看>>
评价中的星效果实现
查看>>
第 6 章 Workstation
查看>>
【机器学习笔记之七】PCA 的数学原理和可视化效果
查看>>
如何运行开源的安卓项目?
查看>>
5.12. standard input/output
查看>>
CentOS使用安装光盘建立本地软件源
查看>>
JavaScript 滑移效果
查看>>
[SEO]让你的Asp.Net网站自动生成Sitemap——XmlSitemap
查看>>
【java JVM】JVM中类的加载,加载class文件的原理机制
查看>>