[HNOI2018]排列[堆]
题意
给定一棵树,每个点有点权,第 \(i\) 个点被删除的代价为 \(w_{p[i]}\times i\) ,问最小代价是多少。
分析
与国王游戏一题类似。
容易发现权值最小的点在其父亲选择后就会立即选择它,可以考虑将其与之父亲合并。
于是问题转化成每个点变得有大小和新的权值,求最小代价。
对于 \(T\) 时刻的没有考虑的数构成的排列,如果 \(i\) 和 \(i-1\) 交换后更优,则有:
\[Tw_{i-1}+(T+t_{i-1})w_i>Tw_i+(T+t_i)w_{i-1}
\]化简过后得到:
\[\frac{t_{i-1}}{w_{i-1}}>\frac{t_i}{w_i}
\]这表明每一步的最优解(在当前局面下,一旦可选就立即选择的点)只和剩余序列有关,与之前的选择无关。每次将最最优的点拿去与父亲合并即可。虽然这里有一些不应该进行比较的信息 (比如祖先和儿子),但是并不影响结果。
时间复杂度 \(O(nlogn)\) 。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define go(u) for(int i = head[u], v = e[i].to; i; i=e[i].lst, v=e[i].to)
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define pb push_back
#define re(x) memset(x, 0, sizeof x)
inline int gi() {
int x = 0,f = 1;
char ch = getchar();
while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar();}
while(isdigit(ch)) { x = (x << 3) + (x << 1) + ch - 48; ch = getchar();}
return x * f;
}
template <typename T> inline bool Max(T &a, T b){return a < b ? a = b, 1 : 0;}
template <typename T> inline bool Min(T &a, T b){return a > b ? a = b, 1 : 0;}
const int N = 5e5 + 7;
int n, ec, nc;
int a[N], par[N], vis[N];
LL ans, t[N], w[N];
struct data {
int u;
LL t, w;
data(){}data(int u, LL t, LL w):u(u), t(t), w(w){}
bool operator <(const data &rhs) const {
if(1ll * t * rhs.w == 1ll * w * rhs.t) return u < rhs.u;
return 1ll * t * rhs.w > 1ll * w * rhs.t;
}
};
set<data>S;
int getpar(int a) {
return par[a] == a ? a : par[a] = getpar(par[a]);
}
int main() {
n = gi();
rep(i, 1, n) {
a[i] = gi();
if(a[i] <= n) {
if(!vis[a[i]]) vis[a[i]] = 1, ++nc;
if(!vis[i]) vis[i] = 1, ++nc;
++ec;
}
}
rep(i, 1, n) w[i] = gi();
if(ec && ec == nc) return puts("-1"), 0;
t[0] = 1;
rep(i, 1, n) {
par[i] = i;
t[i] = 1;
S.insert(data(i, 1, w[i]));
}
while(!S.empty()) {
data now = *S.begin(); S.erase(now);
int u = getpar(now.u), g = getpar(a[u]);
if(g) S.erase(data(g, t[g], w[g]));
ans += t[g] * w[u];
t[g] += t[u];
w[g] += w[u];
par[u] = g;
if(g)
S.insert(data(g, t[g], w[g]));
}
printf("%lld\n", ans);
return 0;
}
[HNOI2018]排列[堆]的更多相关文章
- 5289: [Hnoi2018]排列
5289: [Hnoi2018]排列 链接 分析: 首先将题意转化一下:每个点向a[i]连一条边,构成了一个以0为根节点的树,要求选一个拓扑序,点x是拓扑序中的第i个,那么价值是i*w[x].让价值最 ...
- 【BZOJ5289】[HNOI2018]排列(贪心)
[BZOJ5289][HNOI2018]排列(贪心) 题面 BZOJ 洛谷 题解 这个限制看起来不知道在干什么,其实就是找到所有排列\(p\)中,\(p_k=x\),那么\(k<j\),其中\( ...
- bzoj 5289: [Hnoi2018]排列
Description Solution 首先注意到实际上约束关系构成了一棵树 考虑这个排列 \(p\),编号为 \(a[i]\) 的出现了,\(i\) 才可以出现 那么如果连边 \((a[i],i) ...
- [HNOI2018]排列
Description: 给定 \(n\) 个整数 \(a_1, a_2, \dots, a_n, 0 \le a_i \le n\),以及 \(n\) 个整数 \(w_1, w_2, \dots, ...
- loj2509 hnoi2018排列
题意:对于a数组,求它的一个合法排列的最大权值.合法排列:对于任意j,k,如果a[p[j]]=p[k],那么k<j. 权值:sigma(a[p[i]]*i).n<=50W. 标程: #in ...
- BZOJ.5289.[AHOI/HNOI2018]排列(贪心 heap)
BZOJ LOJ 洛谷 \(Kelin\)写的挺清楚的... 要求如果\(a_{p_j}=p_k\),\(k\lt j\),可以理解为\(k\)要在\(j\)之前选. 那么对于给定的\(a_j=k\) ...
- BZOJ5289: [Hnoi2018]排列
传送门 第一步转化,令 \(q[p[i]]=i\),那么题目变成: 有一些 \(q[a[i]]<q[i]\) 的限制,\(q\) 必须为排列,求 \(max(\sum_{i=1}^{n}w[i] ...
- 【比赛】HNOI2018 排列
这题原题... 这题题面七绕八绕,有点麻烦,反正最后转化就是一棵树,每个点有一个值,要把所有点选完,要求选择一个点必须是它的父亲和祖先已经全部被选了,贡献是这个点的权值乘上它被选择的排名 如果一个点是 ...
- [BZOJ5289][HNOI2018]排列(拓扑排序+pb_ds)
首先确定将所有a[i]向i连边之后会形成一张图,图上每条有向边i->j表示i要在j之前选. 图上的每个拓扑序都对应一种方案(如果有环显然无解),经过一系列推导可以发现贪心策略与合并的块的大小和w ...
随机推荐
- Sqlautocode使用过程的一些坑
Sqlautocode是SQLAlchemy一个数据库映射工具,可以将数据库文件映射为python代码,直接在程序中移植使用.最近在使用过程中遇到了一些坑,通过用代码编辑工具pycharm阅读源码和多 ...
- python变量的命名空间
首先必须要提一下python程序执行过程中变量的查找规则 较官方的查找机制是: 局部作用域--外部函数作用域--全局作用域--内建函数作用域 其实一般内建函数中的作用域很少会涉及到,因为内建函数其实是 ...
- 利用朴素贝叶斯分类算法对搜狐新闻进行分类(python)
数据来源 https://www.sogou.com/labs/resource/cs.php介绍:来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL ...
- 高通GPIO驱动(DTS方式)
gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...
- ssh无法访问服务器报“ssh-dss”认证错误
故障描述: 在windows下的ssh客户端直接报错,内容为: Unable to negotiate with legacyhost: no matching host key type found ...
- Linux 用户名、主机添加背景色
文章参考:PS1应用之——修改linux终端命令行各字体颜色 Linux 用户名.主机添加背景色,用于生产环境,这样可以减少人为的误操作. [root@zhang ~]# tail /etc/bash ...
- java死锁示例及其发现方法
在java多线程编程中很容易出现死锁,死锁就是多个线程相互之间永久性的等待对方释放锁,这和数据库多个会话之间的死锁类似.下面的代码示例了一个最简单的死锁的例子,线程1和线程2相互之间等待对方释放锁来取 ...
- Sring容器技术内幕之InstantiationStrategy类介绍
引言 org.springframework.beans.factory.support.InstantiationStrategy负责根据BeanDefinition对象创建一个Bean实例.Spr ...
- MyBatis实现模糊查询的几种方式
在学习MyBatis过程中想实现模糊查询,可惜失败了.后来上百度上查了一下,算是解决了.记录一下MyBatis实现模糊查询的几种方式. 数据库表名为test_student,初始化了几条记录,如图: ...
- 关于new
JS通过new关键字,可以调用相关的 构造方法 生成一个 对象 ,function ---> object