题目链接

如果\(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 <cstdio>
#include <queue>
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 <node, vector<node>, greater<node> > 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;
}

【洛谷 P4437】 [HNOI/AHOI2018]排列(贪心,堆)的更多相关文章

  1. 洛谷 P4437 [HNOI/AHOI2018]排列(贪心+堆,思维题)

    题面传送门 开始 WA ycx 的遗产(bushi 首先可以将题目转化为图论模型:\(\forall i\) 连边 \(a_i\to i\),然后求图的一个拓扑序 \(b_1,b_2,\dots b_ ...

  2. [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)

    P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...

  3. [HNOI/AHOI2018]排列 贪心

    题面 题解: 把题面的限制换成中文: 如果排在第k位的下标 = 排在第j位的值 ,那么k < j 换一个描述方式: 一个值为x的数要排在第x个数后面. 再换一个描述方式: \(fa[i] = a ...

  4. 洛谷P4438 [HNOI/AHOI2018]道路(dp)

    题意 题目链接 Sol 每当出题人想起他出的HNOI 2018 Day2T3,他都会激动的拍打着轮椅 读题比做题用时长系列... \(f[i][a][b]\)表示从根到\(i\)的路径上,有\(a\) ...

  5. luogu P4437 [HNOI/AHOI2018]排列

    luogu 问题本质是把\(a_i\)作为\(i\)的父亲,然后如果有环就不合法,否则每次要取数,要满足取之前他的父亲都被取过(父亲为0可以直接取),求最大价值 贪心想法显然是要把权值大的尽量放在后面 ...

  6. 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)

    题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...

  7. 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)

    题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...

  8. [洛谷P4436] HNOI/AHOI2018 游戏

    问题描述 一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门.其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开.现在小G告诉了小H ...

  9. 洛谷 P4426 - [HNOI/AHOI2018]毒瘤(虚树+dp)

    题面传送门 神仙虚树题. 首先考虑最 trival 的情况:\(m=n-1\),也就是一棵树的情况.这个我相信刚学树形 \(dp\) 的都能够秒掉罢(确信).直接设 \(dp_{i,0/1}\) 在表 ...

  10. 【LG4437】[HNOI/AHOI2018]排列

    [LG4437][HNOI/AHOI2018]排列 题面 洛谷 题解 题面里这个毒瘤的东西我们转化一下: 对于\(\forall k,j\),若\(p_k=a_{p_j}\),则\(k<j\). ...

随机推荐

  1. crontab部署定时任务

    1.安装cron工具:apt-getinstall cron 2.开启定时任务:crontab –e 定时任务语句格式为:执行周期+命令. 周期有5个域,分别是分,时,日(day of month), ...

  2. CSS中可以和不可以继承的属性【转】

    一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shad ...

  3. 【.Net】win10 uwp unix timestamp 时间戳 转 DateTime

    有时候需要把网络的 unix timestamp 转为 C# 的 DateTime ,在 UWP 可以如何转换? 转换函数可以使用下面的代码 private static DateTime UnixT ...

  4. zookeeper应用实例

    创建持久节点和临时节点 ZooKeeper zk=new ZooKeeper(HOST,CLIENT_SESSION_TIMEOUT,new Watcher(){ @Override public v ...

  5. NHibernate 设置主键不自增长

    1.Model 配置 [PrimaryKey(PrimaryKeyType.Assigned,"ID")] 2.使用时要手动赋值

  6. 【BZOJ4516】生成魔咒(后缀自动机)

    [BZOJ4516]生成魔咒(后缀自动机) 题面 BZOJ Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. ...

  7. 【UOJ#79】一般图最大匹配(带花树)

    [UOJ#79]一般图最大匹配(带花树) 题面 UOJ 题解 带花树模板题 关于带花树的详细内容 #include<iostream> #include<cstdio> #in ...

  8. ms17-010漏洞扫描工具

    说明: 1.先利用masscan进行445端口探测 2.利用巡风的脚本对开放445端口的IP进行ms17-010漏洞扫描. 3.使用方法:Python2运行后,按提示输入单个IP或者IP网段. # c ...

  9. 使用adb录制手机屏幕视频

    adb shell screenrecord命令可以用来录制Android手机视频 screenrecord是一个shell命令,支持Android4.4(API level 19)以上,支持视频格式 ...

  10. 电子商务(电销)平台中商品模块(Product)数据库设计明细

    以下是自己在电子商务系统设计中的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 商品表 (product)|-- 自动编号 (product_id)|-- 商品名称 (produc ...