https://www.lydsy.com/JudgeOnline/problem.php?id=5289

https://www.luogu.org/problemnew/show/P4437

考虑对于a[i]=m,a[m]=n,我们令p[j]=i,p[k]=m(一定会有一对(j,k)满足这个条件的),则我们会有p[k]=a[p[j]],此时我们要满足k<j,也就是a[m]放的位置要比a[i]靠前。

也就是说选第m个之后才能选第i个。

转换成图论模型就是m->i <=> a[i]->i。

那么问题豁然开朗,首先如果图中有环就能判断无解了。

如果有解则必然为以0为根的有向树,则答案为每个节点i被拿到的时间*w[i](前提是i的父亲被拿才可以拿i)。

再考虑最大化答案,则我们让树中最小值min尽可能早的被拿到就好了。

继续贪心,则如果当前局面能够拿到min则一定拿min,换句话将就是拿了min的父亲就一定拿min。

那么父亲和min之间就成了捆绑关系,于是将其缩起来,在缩的过程中更新答案,然后递归这个过程就好了。

每次找min可以用堆维护,复杂度O(nlogn)。

(PS:更新答案,每次更新显然是这个点前面一些点被选了,于是它一定产生了前面这些点个数*w[该点]的价值)

那么就需要考虑我们缩完的点的w要怎么计算,对于两个集合a,b要合并,显然用在计算上的w=wa+wb,但是用堆排序的时候就不能这么做了。

自然能想到取平均值,虽然我不会证明,不过考量一下发现差不多。

#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
typedef long long ll;
typedef long double dl;
typedef pair<dl,int>pii;
#define fi first
#define se second
typedef __gnu_pbds::priority_queue<pii,greater<pii>,__gnu_pbds::pairing_heap_tag> heap;
const int N=5e5+5;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
struct node{int to,nxt;
}e[N];
int n,cnt,head[N],vis[N],a[N],num,fa[N],size[N];
ll w[N],ans;
heap::point_iterator id[N];
heap q;
inline void add(int u,int v){e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
bool dfs(int u){vis[u]=1;num++;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(vis[v]||!dfs(v))return 0;}if(!u&&num<=n)return 0;return 1;
}
inline int find(int x){if(x==fa[x])return x;return fa[x]=find(fa[x]);
}
int main(){n=read();for(int i=1;i<=n;i++)a[i]=read(),add(a[i],i);for(int i=1;i<=n;i++)w[i]=read();if(!dfs(0)){puts("-1");return 0;}for(int i=0;i<=n;i++)fa[i]=i,size[i]=1;for(int i=1;i<=n;i++)id[i]=q.push(pii(w[i],i));while(!q.empty()){int u=q.top().se,v=a[u];q.pop();int rt=find(v);ans+=w[u]*size[rt];fa[u]=rt;w[rt]+=w[u];size[rt]+=size[u];if(rt)q.modify(id[rt],pii((dl)w[rt]/size[rt],rt));}printf("%lld\n",ans);return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9112242.html

BZOJ5289 洛谷4437:[HNOI/AHOI2018]排列——题解相关推荐

  1. 洛谷4438 [HNOI/AHOI2018]道路

    标签:树形DP 题目 题目传送门 题目描述 W 国的交通呈一棵树的形状.W 国一共有n−1n - 1n−1个城市和nnn个乡村,其中城市从111到n−1n - 1n−1 编号,乡村从111到nnn编号 ...

  2. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解

    洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...

  3. 洛谷P3336 [ZJOI2013]话旧 题解

    洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...

  4. 洛谷P4683 [IOI2008] Type Printer 题解

    洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...

  5. 洛谷P3647 [APIO2014] 连珠线 题解

    洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...

  6. 洛谷P4170 [CQOI2007]涂色 题解

    洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...

  7. 洛谷P1868 饥饿的奶牛 题解

    洛谷P1868 饥饿的奶牛 题解 题目链接:P1868 饥饿的奶牛 题意: 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有 NNN 个区间,每个区 ...

  8. 洛谷P1462 通往奥格瑞玛的道路 题解

    洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...

  9. 洛谷 P2015 二叉苹果树 题解

    洛谷 P2015 二叉苹果树 题解 洛谷 P2015 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有NNN个结点(叶子点或者树枝分叉点),编号为1-NNN ...

最新文章

  1. CGI与Servlet的区别和联系
  2. JDK8对并发的新支持
  3. 事件标志组的删除与状态查询
  4. 学习笔记(十三)——vim编辑与linux命令
  5. error LNK2001: unresolved external symbol QtCored.lib using staic Qt lib
  6. php处理form多文件上传,ajax利用FormData、FileReader实现多文件上传php获取
  7. 计算机网络中常见拓扑结构及特点,常见的网络拓扑结构有哪些?并说明其优缺点....
  8. 浏览器皮肤_和平精英返场皮肤投票时间是什么时候?投票地址入口介绍-手游资讯...
  9. Complex类与运算符重载
  10. Python高手之路【十二】面向对象设计模式
  11. 免安装版的Mysql
  12. mysql_分页、联合查询
  13. 单龙芯3A3000-7A1000PMON研究学习-(10)撸起袖子干-pmoncfg Bonito 干了什么?(这是make cfg的部分)
  14. 面向光栅薄膜光学性能探究的Rsoft建模与仿真
  15. 零门槛修改微信步数(基于虚拟xposed)
  16. Python 轻松操作Excel,实现自动化办公
  17. iphone html复制粘贴,如何在iPhone上复制内容快速粘贴到iPad上?
  18. 安装服务器系统教程20180615
  19. 每日10行代码86: 计算两个向量的夹角余弦值
  20. 华为mate50参数配置 华为mate50是5g吗

热门文章

  1. c语言经典算法大全pdf,c语言经典算法100例pdf版.pdf
  2. 浅析拯救小矮人的 nlogn 算法及其证明
  3. Celery 之异步任务、定时任务、周期任务
  4. angular接口传参
  5. P2787 语文1(chin1)- 理理思维
  6. 获取input相同名字的元素的值
  7. Idea实现WebService实例 转
  8. HC-05蓝牙模块基本使用
  9. gitlab 使用教程
  10. JSON数据格式解析库(cJSON、Jansson)的使用在STM32上移植和使用