[HNOI/AHOI2018]排列
如果\(a[i]=j\)则序列\(p[]\)中\(j\)必须排在\(i\)前面,如果\(j\)不在范围内则不管,求一个式子\(\sum_{i=1}^n iw_{p[i]}\)的最大值
考虑建出一个图,连边\(k=a_j\to j\)方向表示顺序,这样\([1,n]\)每个点的入度都会是\(1\)
如果有环那么就无解,否则这个图就是一棵以\(0\)为根树,如果是在树上的话,也就是说必须要先选父亲才能选儿子
考虑一种贪心
考虑一个当前权值最小的点\(i\)
\(1.\)如果\(i\)没有父亲\((fa[i]=0)\),那么我们当前一定是选\(i\)
\(2.\)如果\(i\)有父亲,那么当\(fa[i]\)选了后我们一定会最先选\(i\)
也就是说在最后的排列中\(fa[i]\)和\(i\)是挨在一块的,但是考虑到实际上多次合并后每个节点就是一个序列
手模以后发现,平均权值小的放前面答案会更优
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cassert>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
typedef long double ld;
const int INF=1e9+7;
typedef pair<ld,int> pdi;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
}
const int MAXN=5e5+5;
LL w[MAXN],done[MAXN];
int Fa[MAXN],a[MAXN];
int n;LL ans;
priority_queue <pdi,vector<pdi>,greater<pdi> > q,t;
inline int getfa(int x){return Fa[x]==x?x:Fa[x]=getfa(Fa[x]);}
int main(){
n=read();
for(int i=1;i<=n;i++) Fa[i]=i;
for(int i=1;i<=n;i++){
a[i]=read();
int fx=getfa(i),fy=getfa(a[i]);
if(fx==fy){printf("-1\n");return 0;}
Fa[fx]=fy;//直接用并查集判环
}
for(int i=1;i<=n;i++)
ans+=(w[i]=read());//先加一遍
for(int i=0;i<=n;i++) Fa[i]=i;
for(int i=1;i<=n;i++){
done[i]=1;
q.push(pdi((ld)w[i],i));
}
for(int i=1;i<=n;i++){
while(!t.empty()&&q.top()==t.top()){//每次删掉q.top(),可以保证正确性
t.pop();q.pop();
}
int x=q.top().second;q.pop();
assert(x==Fa[x]);
int y=getfa(a[x]);
if(y) t.push(pdi((ld)w[y]*1.0/done[y],y));//删掉
ans+=w[x]*done[y];//之前已经选了多少个,现在就接着选
w[y]+=w[x],done[y]+=done[x],Fa[x]=y;//合并个数到上一层(y可以等于0)
if(y) q.push(pdi((ld)w[y]*1.0/done[y],y));//更新
}
printf("%lld\n",ans);
}
[HNOI/AHOI2018]排列的更多相关文章
- 【LG4437】[HNOI/AHOI2018]排列
[LG4437][HNOI/AHOI2018]排列 题面 洛谷 题解 题面里这个毒瘤的东西我们转化一下: 对于\(\forall k,j\),若\(p_k=a_{p_j}\),则\(k<j\). ...
- [HNOI/AHOI2018]排列 贪心
题面 题解: 把题面的限制换成中文: 如果排在第k位的下标 = 排在第j位的值 ,那么k < j 换一个描述方式: 一个值为x的数要排在第x个数后面. 再换一个描述方式: \(fa[i] = a ...
- 洛谷 P4437 [HNOI/AHOI2018]排列(贪心+堆,思维题)
题面传送门 开始 WA ycx 的遗产(bushi 首先可以将题目转化为图论模型:\(\forall i\) 连边 \(a_i\to i\),然后求图的一个拓扑序 \(b_1,b_2,\dots b_ ...
- BZOJ5289 HNOI/AHOI2018排列(贪心+堆)
题面描述的相当绕,其实就是如果ai=j,重排后ai要在aj之后.同时每个ai有附属属性wi,要求最大化重排后的Σiwi. 容易发现这事实上构成一张图,即由j向i连边.由于每个点入度为1或0,该图是基环 ...
- 【洛谷 P4437】 [HNOI/AHOI2018]排列(贪心,堆)
题目链接 如果\(j<=k,a_{p[j]}!=p[k]\)可以理解为如果\(a_{p[j]}=p[k]\),那么\(k\)一定要放在\(j\)前面,也就是\(a_j\)在\(j\)前面. 于是 ...
- BZOJ5289 & 洛谷4437:[HNOI/AHOI2018]排列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5289 https://www.luogu.org/problemnew/show/P4437 考虑 ...
- Poj2054 color a tree && [HNOI/AHOI2018]排列
https://zybuluo.com/ysner/note/1120723 题面 原题 某省选强化题 大致意思是给你一颗树,选父亲后才能选儿子. 每个点对答案的贡献为你在第几次选这个点 × 该点权值 ...
- luogu P4437 [HNOI/AHOI2018]排列
luogu 问题本质是把\(a_i\)作为\(i\)的父亲,然后如果有环就不合法,否则每次要取数,要满足取之前他的父亲都被取过(父亲为0可以直接取),求最大价值 贪心想法显然是要把权值大的尽量放在后面 ...
- 【题解】Luogu P4436 [HNOI/AHOI2018]游戏
原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...
随机推荐
- PHP 商城无限极分类
无限极分类,用的是递归,在外部调用fen()方法即可 index是刚开始寻找的顶级分类,suo是为了在前端展示的时候缩进 ,$suo=){ 一个数组用来返回的 $t=[]; 这是查询数据库的所有内容 ...
- 带你剖析WebGis的世界奥秘----瓦片式加载地图(转)
带你剖析WebGis的世界奥秘----瓦片式加载地图 转:https://zxhtom.oschina.io/zxh/20160805.html 编程 java 2016/08/05 0留言, ...
- php 读取和下载execl
最近用到php 对excel 的操作 下来 小弟为大家 先贴一下自己的代码 有什么补充的 大神们请指点下.感激不尽. 我用的是yii2 yii2中有类 phpexcel 先说说下载吧. 首先下载 ...
- c++ deque 容器
deque (全名 double ended queue)是一种具有队列和栈一样的数据结构. 在c++标准库中几乎和vector容器的接口完全相同,但它和vector 还是有一些细微的差别. 1. d ...
- Visual Studio + C# + Xamarin = iOS/Android/Windows Apps
Visual Studio 跨平台開發實戰 (1) -- Hello Xamarin! 前言 應用程式發展的腳步,從來沒有停過.從早期的 Windows 應用程式, 到網路時代的 web 應用程式,再 ...
- IFM设备 Linux方面资料
Github: https://github.com/lovepark/ifm3d
- 1.sql简介
在总结sql语句前,说点无聊的哈哈 SQL 是用于访问和处理数据库的标准的计算机语言. SQL 能做什么? SQL 面向数据库执行查询 SQL 可从数据库取回数据 SQL 可在数据库中插入新的记录 S ...
- Mac anzhuangxgboost
2. 从Github库安装XGBoost 第一步, 克隆最新的XGBoost到本地 git clone --recursive https://github.com/dmlc/xgboost 第二步, ...
- NAO机器人
NAO机器人是Aldebaran Robotics公司研制的一款人工智能机器人.它拥有着讨人喜欢的外形,并具备有一定程度的人工智能和约一定程度的情感智商并能够和人亲切的互动. 教学研究类/NAO机器人 ...
- Extjs Ext.TreePanel
TreePanel 简单实例. <link rel="stylesheet" href="Js/ext-4.2/resources/css/ext-all-nept ...