题意

题目链接

Sol

神仙题Orz

首先不难看出如果我们从\(a_i\)向\(i\)连一条边,我们会得到以\(0\)为根的树(因为每个点一定都有一个入度,出现环说明无解),同时在进行排列的时候需要保证父亲节点一定在孩子节点之前出现

接下来考虑直接贪心。对于某些权值很小的点,我们需要让其尽早出现,同时又要满足选择的条件。

那么我们可以从小的点开始,依次向他的父亲合并,并删除该点(也就是如果父亲一但被删除,那么这个点立马被删除)

下面的内容抄袭摘抄自这里

然后直接用set搞一搞

复杂度:\(O(n\log n)\)

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 5e5 + 10, SS = 1e7 + 10;
template<typename A, typename B> inline void chmax(A &x, B y) {
x = x > y ? x : y;
}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, a[MAXN], fa[MAXN], vis[MAXN], ufa[MAXN];
LL w[MAXN], siz[MAXN];
vector<int> v[MAXN];
struct comp {
bool operator ()(int x, int y) {
return w[x] * siz[y] == w[y] * siz[x] ? x < y : w[x] * siz[y] < w[y] * siz[x];
}
};
int find(int x) {
return ufa[x] == x ? ufa[x] : ufa[x] = find(ufa[x]);
}
set<int, comp> s;
int dfs(int x) {
vis[x] = 1;
for(auto &to : v[x]) {
if(vis[to] == 1) return 1;
if(dfs(to)) return 1;
}
vis[x] = 2;
return 0;
}
int main() {
N = read();
for(int i = 1; i <= N; i++) {
fa[i] = read();
v[fa[i]].push_back(i);
}
for(int i = 1; i <= N; i++)
if(!vis[i])
if(dfs(i)) {puts("-1"); return 0;}
for(int i = 1; i <= N; i++) w[i] = read(), ufa[i] = i, siz[i] = 1, s.insert(i);
siz[0] = 1; ufa[0] = 0;
LL ans = 0;
for(int i = 1; i <= N; i++) {
int x = *s.begin(); s.erase(s.begin());
int f = find(fa[find(x)]);
if(f) s.erase(f);
ans += siz[f] * w[x];
siz[f] += siz[x]; w[f] += w[x];
ufa[x] = f;
if(f) s.insert(f);
}
cout << ans;
return 0;
}
/*
3
0 1 1
5 7 3
*/

loj#2509. 「AHOI / HNOI2018」排列(思维题 set)的更多相关文章

  1. loj #2509. 「AHOI / HNOI2018」排列

    #2509. 「AHOI / HNOI2018」排列   题目描述 给定 nnn 个整数 a1,a2,…,an(0≤ai≤n),以及 nnn 个整数 w1,w2,…,wn.称 a1,a2,…,an 的 ...

  2. 【LOJ】#2509. 「AHOI / HNOI2018」排列

    题解 虽然要求一个dfs序,但是不是从根开始贪心 从最小的点开始贪心,最小的点显然是父亲选了之后马上就选它 那么我们每次把最小的点和父亲合并,两个联通块之间也是如此 对于两个联通块,他们合并的顺序应该 ...

  3. Loj #2495. 「AHOI / HNOI2018」转盘

    Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...

  4. Loj #2494. 「AHOI / HNOI2018」寻宝游戏

    Loj #2494. 「AHOI / HNOI2018」寻宝游戏 题目描述 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得 ...

  5. loj #2510. 「AHOI / HNOI2018」道路

    #2510. 「AHOI / HNOI2018」道路 题目描述 W 国的交通呈一棵树的形状.W 国一共有 n−1 个城市和 nnn 个乡村,其中城市从 111 到 n−1 编号,乡村从 111 到 n ...

  6. loj #2508. 「AHOI / HNOI2018」游戏

    #2508. 「AHOI / HNOI2018」游戏 题目描述 一次小 G 和小 H 在玩寻宝游戏,有 nnn 个房间排成一列,编号为 1,2,…,n,相邻房间之间都有 111 道门.其中一部分门上有 ...

  7. @loj - 2496@ 「AHOI / HNOI2018」毒瘤

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的 ...

  8. loj#2510. 「AHOI / HNOI2018」道路 记忆化,dp

    题目链接 https://loj.ac/problem/2510 思路 f[i][a][b]表示到i时,公路个数a,铁路个数b 记忆化 复杂度=状态数=\(nlog^2n\) 代码 #include ...

  9. loj#2020 「AHOI / HNOI2017」礼物 ntt

    loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...

随机推荐

  1. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  2. LeetCode--No.010 Regular Expression Matching

    10. Regular Expression Matching Total Accepted: 89193 Total Submissions: 395441 Difficulty: Hard Imp ...

  3. SSM工作流程的大致理解

    //不是根据源码来理解的,所以细节有省略.. 首先从在浏览器输入URl的那一刻开始 例如输入 localhost:8080/MyProject/listCategory 初始化: 此时tomcat已经 ...

  4. 【xsy2304】哈 最短路

    题目大意:有一个$n$个点,$m$条有向边的图,有$q$组询问. 每次询问:从$a$到$b$,经过不超过$c$条边,且依次经过的边边权递增,问最短路为多少,无解输出-1. 数据范围:$n≤150$,$ ...

  5. [视频]K8飞刀 Discuz! X 系列(1.5 2.5 3.x)产品升级漏洞GetShell教程

    K8飞刀 Discuz! X 系列(1.5 2.5 3.x)产品升级漏洞GetShell教程 https://pan.baidu.com/s/1bnv2euz

  6. shell中的算数

    加法:let result=var1+var2result=$[$var1+var2]result=$(($var1+var2))result=`expr $var1 + $var2*` 加号前后有空 ...

  7. Python:使用基于事件驱动的SAX解析XML

    SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 ...

  8. 程序员、互联网从业者必读KK凯文凯利三大力作之《失控》总结

  9. 线程的中断(Lock与synchronized)

    Thread包含interrupt()方法,因此你可以终止被阻塞的任务,这个方法将设置线程的中断状态.如果一个线程已经被阻塞,或者试图执行一个阻塞操作.那么设置这个线程的中断状态将 抛出Interru ...

  10. 2018.4.24-ml笔记(多元线性回归)

    numpy.dot作用于两个向量则是它们内积,作用于矩阵则是矩阵积. RMSE解决量纲问题,即单位 RMSE会放大差值比较大的值,所以选用MSE更好.