当前位置: 首页 > news >正文

LG P5008 [yLOI2018] 锦鲤抄 Solution

Description

给你一张 nnnmmm 边的有向GGG(可能有自环),每个点有一个点权 wiw_iwi,还有一个变量 SSS,初始时 S=0S=0S=0.
你可以任意选择一个入度 >0>0>0 的点 uuu,把 uuuuuu 的全部出边删掉,并让 S←S+wuS\gets S+w_uSS+wu.
你最多能执行 kkk 次这样的操作,求 SSS 的最大可能值.

Limitations

1≤n≤5×105+41\le n\le 5\times 10^5 +41n5×105+4
1≤m≤2×106+41\le m\le 2\times 10^6+41m2×106+4
0≤wi≤103,0≤k≤n0\le w_i\le 10^3,0\le k\le n0wi103,0kn

Solution

这题有紫吗?
考虑若 GGG 是个 DAG,那么只要按照 topo 序倒序删,所有入度 >0>0>0 的点都能删干净,选 wwwkkk 大的即可.
否则,可以把图缩成 DAG 变成上面情况,然后只需考虑 SCC 内部如何选.

  • 若一个 SCC 有入度,那么所有点都能删干净.
  • 若一个 SCC 没有入度,那么只有一个点无法删掉,我们显然要留下 www 最小的点.
  • 若一个 SCC 有自环,那么所有点也是能删干净的,需要特判.

找出所有候选点后,排序即可求出答案(当然用 nth_element 更快).

Code

1.92KB,1.19s,66.13MB  (c++20 with o2)1.92\text{KB},1.19\text{s},66.13\text{MB}\;\texttt{(c++20 with o2)}1.92KB,1.19s,66.13MB(c++20 with o2)

#include <bits/stdc++.h>
using namespace std;using i64 = long long;
using ui64 = unsigned long long;
using i128 = __int128;
using ui128 = unsigned __int128;
using f4 = float;
using f8 = double;
using f16 = long double;template<class T>
bool chmax(T &a, const T &b){if(a < b){ a = b; return true; }return false;
}template<class T>
bool chmin(T &a, const T &b){if(a > b){ a = b; return true; }return false;
}signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m, k;cin >> n >> m >> k;vector<int> w(n);for (int i = 0; i < n; i++) cin >> w[i];vector<vector<int>> g(n);for (int i = 0, u, v; i < m; i++) {cin >> u >> v, u--, v--;g[u].push_back(v);}vector<int> dfn(n, -1), low(n, -1), bel(n, -1), scc;vector<bool> ins(n);stack<int> stk;int clock = 0;auto dfs = [&](auto&& self, int u) -> void {dfn[u] = low[u] = clock++;ins[u] = true, stk.push(u);for (auto v : g[u]) {if (dfn[v] == -1) self(self, v), chmin(low[u], low[v]);else if (ins[v]) chmin(low[u], dfn[v]);}if (low[u] == dfn[u]) {int id = bel[u] = scc.size();scc.push_back(u), ins[u] = false;int v = stk.top(); stk.pop();for (; v != u && !stk.empty(); v = stk.top(), stk.pop()) {bel[v] = id;if (w[v] < w[scc[id]]) scc[id] = v;ins[v] = false;}}};for (int i = 0; i < n; i++) if (dfn[i] == -1) dfs(dfs, i);vector<int> ind(scc.size());vector<bool> loop(scc.size());for (int u = 0; u < n; u++) for (auto v : g[u]) {if (bel[u] != bel[v]) ind[bel[v]]++;else if (u == v) loop[bel[u]] = true;}vector<int> candi;for (int u = 0; u < n; u++) if (ind[bel[u]] || scc[bel[u]] != u || loop[bel[u]])candi.push_back(w[u]);if (candi.size() < k) candi.resize(k);nth_element(candi.begin(), candi.begin() + k, candi.end(), greater<int>());int ans = 0;for (int i = 0; i < k; i++) ans += candi[i];cout << ans;return 0;
}
http://www.dtcms.com/a/342493.html

相关文章:

  • 读《精益数据分析》:精益画布——创业与产品创新的高效工具
  • RabbitMQ:消费者可靠性(消费者确认、消费失败处理、业务幂等性)
  • RabbitMQ面试精讲 Day 26:RabbitMQ监控体系建设
  • 1. 准备工作---数据分析编程 - 从入门到精通
  • uniapp 自定义组件封装、easycom匹配规则
  • Go语言变量声明与初始化详解
  • TDengine IDMP 运维指南(管理策略)
  • CRII-Net
  • 【领码课堂】让Java数据检索更智能——Bean Searcher全景解读
  • 从”0“开始学JAVA——第九节下 泛型和集合框架
  • #运维 | 前端 # Linux http.server 实践:隐藏长文件名,简短路径 (http://IP:port/别名 ) 访问
  • AI研究引擎的简单技术实现步骤
  • Web 安全之 HTTP 响应截断攻击详解
  • JavaScript 系列之:图片压缩
  • 微信小程序设计的请求封装方案(request.js)
  • NPM模块化总结
  • DINOv3 重磅发布
  • 计算机网络技术学习-day6《三层交换机配置》
  • python发布文章和同步文章到社区的工具小脚本
  • 第三阶段数据库-6:sql中函数,多表查询,运算符,索引,约束
  • 智慧城管云平台源码,微服务vue+element+springboot+uniapp技术架构,数字化综合执法办案系统
  • 数据结构之排序大全(4)
  • 苷类成分通过 PI3K/AKT 信号通路促进内皮祖细胞来源外泌体修复受损血管内皮
  • 基于YOLO11的茶叶病害智能检测系统
  • 组态软件——工业监控“大脑”
  • leetcode-python-242有效的字母异位词
  • 代码随线录刷题Day39
  • 【uni-app】自定义导航栏以及状态栏,胶囊按钮位置信息的获取
  • Java的运行时数据区
  • Notepad++换行符替换