EVERYTHING HAPPENS FOR THE BES|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-05-17 18:00阅读: 15评论: 0推荐: 0

abc256_e Takahashi's Anguish 题解

Takahashi's Anguish

题意

n 个人,每个人都有一个看不惯的人,第 i 个人看不惯 xi,如果 xi 站在 i 的前面,则会产生 ci 的不愉悦值。

求一个排列顺序,使得产生的不愉悦值最小,求最小值。

思路

做题之前先推样例。——鲁迅

其实带点模板的意味,每次建立一条从 xii 的边,边权为 ci,那么样例就是这样:

能够发现,样例的答案来源于那条用红笔圈出来的边,思路也很明显了,对于不构成环的一些边来说,必然存在一种排列方法使得这些人不会不愉悦;而对于一个环呢?它必然会使得某个人不愉悦,只要把那个边权最小的加到答案即可。

Code

点击查看代码
#include <iostream>
#include <vector>
using namespace std;
using pr = pair<int, int>;
using ll = long long;
const int N = 2e5 + 10;
int n, a[N], c, f[N], stk[N], top; // stack 维护环上边的权值
vector<pr> v[N];
ll ans;
void dfs (int x) {
if (f[x]) {
if (f[x] == 1) { // 判断构成环
int sum = 1e9 + 10;
for (int i = 0; i < top; i++) {
sum = min(sum, stk[i]); // 选择边权最小值,加入答案
}
ans += sum;
}
return ;
}
f[x] = 1; // 标记在环上
for (pr i : v[x]) {
stk[top++] = i.second; // 将边权压入栈
dfs(i.first);
top--; // 弹出栈顶
}
f[x] = 2; // 标记不在环上但走过这个点
}
int main () {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> c;
v[a[i]].push_back({i, c}); // 建图
}
for (int i = 1; i <= n; i++) {
dfs(i); // 对每个点都要经行遍历
}
cout << ans;
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17409600.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(15)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
战 歌 - 此去经年
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 此去经年

作曲 : 此去经年

编曲 : 此去经年

啊啊啊啊啊

啊啊啊啊

啊啊啊

啊啊

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示