D

Problem - D - Codeforces

题意:

  给定一个有向图,每个点有自己的点权,求一条长度为K的路径使得路径上的最大点权最小,输出该条路径上的最大点权。

思路:(二分+拓扑排序)

  最小值最大的题考虑二分解决。

  我们每次二分答案为mx,以此判断有没有某条路径的最大值为mx且长度为k。因为我们要保证二分出来的mx是该条路径上最大的点权,所以所有大于mx的点我们都要舍弃。

  其次如果路径中含环那必然是可以的,如果不含吗,就需要判断是否存在长度为k,最大值为mx的路径

  举个例子:

    最初的图       

  当k == 4时,当我们判断mid = 4(既mx=4)时,则存在这样一条路径

                 

    chick返回true

  判断环的时候可以通过拓扑排序来判断

  在chick的时候需要注意的是,因为我们每次取的是小于等于mx的点,所以每次每个点的入度都不同,都需要重新统计

 1 const int N = 2e5 + 10,INF = 0x3f3f3f3f3f;
2 int n, m, k, w[N];
3 vector<int> g[N];
4 int vis[N], deg[N], deep[N];/*vis判断是否小于等于mx,deg统计入度,deep统计路径长度*/
5 vector<pair<int, int> >e;
6
7 bool chick(int mx) {
8 for (int i = 1; i <= n; ++i) vis[i] = 0, deg[i] = 0, deep[i] = -INF;
9 for (int i = 1; i <= n; ++i) {
10 if (w[i] <= mx)vis[i] = 1;
11 }
12 for (auto it : e) {
13 if (w[it.first] <= mx && w[it.second] <= mx) {
14 deg[it.second]++;
15 }
16 }
17 queue<int> q;
18 for (int i = 1; i <= n; ++i ) {
19 if (vis[i] && !deg[i])q.push(i),deep[i] = 1;
20 }
21 while (q.size()) {
22 int u = q.front();
23 q.pop();
24 for (int s : g[u]) {
25 if (!vis[s]) continue;
26 deep[s] = max(deep[s], deep[u] + 1);
27 if (deep[s] >= k) return 1;
28 deg[s]--;
29 if (deg[s] == 0) q.push(s);
30 }
31 }
32 for (int i = 1; i <= n; ++i) {
33 if (vis[i] && deg[i] > 0)return 1;
34
35 }
36 return 0;
37 }
38
39 void solve() {
40 cin >> n >> m >> k;
41 for (int i = 1; i <= n; ++i) cin >> w[i];
42 for (int i = 1; i <= m; ++i) {
43 int x, y;
44 cin >> x >> y;
45 g[x].push_back(y);
46 e.push_back({x, y});
47 }
48 if (k == 1) {
49 cout << *max_element(w + 1, w + 1 + n) << endl;
50 return;
51 }
52 int ans = INF;
53 int l = 0, r = 1e9 + 1;
54 for (int i = 1; i <= 50; ++i) {
55 int mid = (l + r) >> 1;
56 if (chick(mid)) {
57 ans = min(ans, mid);
58 r = mid - 1;
59 } else l = mid + 1;
60 }
61 if (ans == INF) {
62 cout << -1 << endl;
63 } else cout << ans << endl;
64 }

Codeforces Round #791(Div 2)——D的更多相关文章

  1. Codeforces Round #791 (Div. 2) A-C

    Codeforces Round #791 (Div. 2) A-C A 题目 https://codeforces.com/contest/1679/problem/A 题解 思路 知识点:数学,暴 ...

  2. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  3. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  4. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  5. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  6. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  7. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  8. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  9. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

随机推荐

  1. GIL互斥锁与线程

    GIL互斥锁与线程 GIL互斥锁验证是否存在 """ 昨天我们买票的程序发现很多个线程可能会取到同一个值进行剪除,证明了数据是并发的,但是我们为了证明在Cpython中证 ...

  2. Spring的俩大核心概念:IOC、AOP

    1.Spring 有两个核心部分: IOC 和 Aop (1)IOC:控制反转,把创建对象过程交给 Spring 进行管理   (2)Aop:面向切面,不修改源代码进行功能增强 2.Spring 特点 ...

  3. 「题解报告」P4577 [FJOI2018]领导集团问题

    题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...

  4. Mysql8.0修改lower_case_table_names参数导致重启失败

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 事件起因:在测试一个数据迁移工具时,源端oracle ...

  5. KingbaseES例程之拥有大量索引的表导入数据

    概述 如何快速插入大量数据比如几千万上亿的带索引的数据表. 数据准备 准备一个拥有二十个索引的数据表. kingbase=# \d+ bigtab Table "kingbase.bigta ...

  6. KingbaseES R3集群在线删除数据节点案例

    案例说明: kingbaseES R3集群一主多从的架构,一般有两个节点是集群的管理节点,所有的节点都可以为数据节点:对于非管理节点的数据节点可以在线删除:但是对于管理节点,无法在线删除,如果删除管理 ...

  7. jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    前言:上篇已介绍了jenkins在k3s环境部署,本篇继续上篇讲述流水线构建部署流程 1.从gitlab上拉取代码步骤 在jenkins中,新建一个凭证:Manage Jenkins -> Ma ...

  8. 使用J2EE 登录实例开发

    我们先了解下Servlet的生命周期 Servlet部署在容器里,其生命周期由容器管理. 概括为以下几个阶段: 1)容器加载Servlet类. 当第一次有Web客户请求Servlet服务或当Web服务 ...

  9. synchronized锁详解

    synchronized的意义 解决了Java共享内存模型带来的线程安全问题: 如:两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?(针对这个问题进行分析 ...

  10. C语言[char**]与[malloc]的组合使用

    简介 首先!要搞懂char**是什么? 我们知道 char* 是字符指针,是一个地址,指向一个字符串. 那么 char** 就是指向 char* 的指针,也是一个地址,指向指针的指针. 使用char* ...