P8328 [COCI 2021/2022 #5] Usmjeravanj

本题的实际难度和通过数不是相符。

实际思维难度:蓝

代码实现难度:绿

部分1、简化题意

存在两条河流,假设分别叫做① 和 ②。

其中①号河流有 \(a\) 座城市, ② 号河流有 \(b\) 座城市。

河流方向是从编号小的城市流向编号大的城市,现在准备在两条河流的某些城市上建立 \(m\) 座桥, 每座桥都是单向的,请给定每座桥的方向,

其中 \(0\) 方向代表从河流 ① 上的城市到河流 ② 的城市, \(1\) 方向刚好相反。

现在需要使得强连通分量最少,请给出每座桥的具体方向(输出任意一个即可)

比如下图就是一个参考。

样例一分析:

输入:

5 3
4
1 2
2 3
3 1
5 3

输出:

按照下方给定的最优合法方案,是按照下图所示,所有城市都是连通的。

1
1 1 0 0

部分2、思路分析

首先上述的题目跟有向图的连通有关,大概率是强连通分量,如果没有给定边的选择,直接给定方向,直接可以建边获取得到scc。

值得注意的是,①号河流和②号河流的城市编号相同,肯定不可取,所以可以给②号河流加上一个偏移量

比如

add_edge(a[i], b[i] + n);

答案求解已经得到,重点是如何建边?

首先考虑的一点是,选定合适的桥的方向,可以减少强连通分量的数量,假设目前只有两座桥,先进行分类讨论:

情况一:两座桥不交叉,并且相同方向

结论:下述四种情况,最终无论情况如何,得到的结果对scc无影响。

情况二:两座桥不交叉,并且不同方向

结论:下述四种情况,最终无论情况如何,得到的结果对scc无影响。

情况三:两座桥交叉,并且相同方向

结论:下述两种情况对scc无影响

情况四:两座桥交叉,并且不同方向

结论:只有第一张图的方案可以使得scc数量减少,但是第二张图对scc无影响。

最终结论:所有的建边方向,考虑交叉之后,方向相反的答案(按照下图建边)

部分3、具体实现和代码细节

如何判断最终结论,首先假设将所有的桥进行了存储,分别标记为 \(x_i\) 和 \(y_i\) 。

桥交叉的话,只可能是以下两种选择

选择1、黑色桥是之前已经选择过的,红色的桥是现在需要控制方向的,此处无论黑色的桥的方向如何,

按照如下图所示的方向,从 $x_i $ 指向 $ y_i$ 一定是最佳的。

判断方式是

$x < x _ i $ 并且 $ y_i < y$

选择2、黑色桥是之后需要选择的,绿色桥是现在需要选择的方向,按照这种方式才可能交叉。

综上:桥的方向选择比较容易确定,考虑桥的选择的优先顺序,首先确立上述的绿色的边,然后确立红色的边会比较方便一些。

另外看到上述的判断方式,二维偏序关系,可以先排序处理为一维偏序。

按照 \(x\) 的顺序从小到大,这样我们在选择的时候,桥枚举的时候,①号河流的城市编号非递减,此时比较交叉的时候,下述关系的

$x < x _ i $ 自动满足,另外只需要找到 $ y_i < y$ ,那么如何判断有没有交叉,需要获取 \(R = y_{max}\) ,也就是之前选择过的桥的 \(y\) 的最大值。

因为我们需要让 \(y_i\) (现在枚举的桥) 交叉的数量最多,此时的 \(y\) (之前出现过的桥) 值越大越好。

说的简单点就是,下方的两座桥,当 \(x\) 相等的时候,我们肯定会优先把后面绿色的桥的方向考虑,因为后面的桥可以交叉的数量更多。

代码实现步骤:

步骤一:按照x作为第一关键词,从小到大排序,按照y作为第二关键词,从大到小排序

步骤二:如果枚举的y[i] <= R,说明有交叉,选定边的方向和上述图之中的红色边一致,也就是0方向;如果枚举的 y[i] > R ,说明没有交叉,但是此时的y更大,需要更新R, 此时按照绿色边(选择2)去处理更优,也就是 1 方向。

代码参照:

P8328 [COCI 2021/2022 #5] Usmjeravanj的更多相关文章

  1. 2021 & 2022年终回顾:山河无恙,烟火寻常

    前言 又到了一年一度年终回顾的时候了,回想起去年年底圣诞节的时候由于忙着参加黑客松大赛,一下子就进入了新的一年,失去了年终回顾的动力,所以今年提前两个月开始进行回顾,这样的话今年最后一天就可以顺利发文 ...

  2. 年中盘点 | 2022年,PaaS 再升级

    作者丨刘世民(Sammy Liu)全文共7741个字,预计阅读需要15分钟 过去十五年,是云计算从无到有突飞猛进的十五年.PaaS作为云计算的重要组成部分,在伴随着云计算高速发展的同时,在云计算产业链 ...

  3. Bzoj索引

    1001 : http://ideone.com/4omPYJ1002 : http://ideone.com/BZr9KF1003 : http://ideone.com/48NJNh1004 : ...

  4. 分析java.lang.NullPointerException thrown in RelativeLayout measure()

    典型的再现环境 模型: Sony Ericsson Android version: 2.3.4 StackTrace: E/AndroidRuntime( 3579): FATAL EXCEPTIO ...

  5. Hsql中In没有1000的限制

    SELECT * FROM user , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ...

  6. 解决Nginx重启时提示nginx: [emerg] bind() to 0.0.0.0:80错误

    Nginx是一款轻量级的Web服务器,特点是占有内存少,并发能力强,因而使用比较广泛,蜗牛今天在一个VPS上重启Nginx时提示“nginx: [emerg] bind() to 0.0.0.0:80 ...

  7. 转 nagios监控oracle运行状况

    https://blog.csdn.net/heizistudio/article/details/8638488 nrpe安装脚本 nagios-plugins-1.4.13.tar.gznrpe- ...

  8. MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析

    MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析 注:MATLAB版本--2016a,作图分析部分见<MATLAB之折线图.柱状图.饼图以及常用绘图技巧> 一.现状模式下的模型 % ...

  9. 小菜鸟之Oracle数据库

    select * from STUDENT; select * from mark; select * from COURSE; select * from teacher; --注释 select ...

  10. Oracle-SQL程序优化案例二

    有时候写得不规范的SQL语句真的是占用很多时间 以下是我在工作中发现的规律,如果字段过多的使用函数,尽量不要将这些字段串联在一起做匹配或查询条件,比如红色注释部分,在执行红色部分的时候 这个SQL程序 ...

随机推荐

  1. JavaScript最佳实践:从基础到高级

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  2. 市盈率指标EP在A股市场的分析

    因子经济金融特性 EP因子即市盈率因子,常被投资者使用的几个估值因子之一.一般使用PE,即Price to Earning, 维基百科上的解释:市盈率指每股市价除以每股盈利(Earning Per S ...

  3. WPF Thumb 滑块控件踩坑

    最近在做一个仿 手机选择时间的控件,如下图,选用了 Thumb 滑块控件做上下滑动的功能.订阅了 Thumb_OnDragStarted.Thumb_DragDelta和Thumb_DragCompl ...

  4. Jackson反序列化抛异常:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field的解决方法

    目录 需求背景 问题分析 问题解决 使用注解@JsonIgnoreProperties ObjectMapper对象配置FAIL_ON_UNKNOWN_PROPERTIES 需求背景   第三方服务返 ...

  5. markitdown的安装与简单使用

    欢迎阅读我的blog! 个人网站阅读<markitdown 的安装和简单使用> 安装 microsoft/markitdown: Python tool for converting fi ...

  6. python C3算法

    Python MRO C3算法是python当中计算类继承顺序的一个算法,从python2.3以后就一直使用此算法了. c3 linearization算法称为c3线性化算法 C3算法原理 首先定义几 ...

  7. 「Log」2023.8.25 小记

    序幕 到校同学都没来,先摆. 写博客,写啊,写啊. 改费用流板子. \(\color{royalblue}{P3381\ [模板]最小费用最大流}\) 板子. 痛心疾首,建边的时候费用边反边为负权边. ...

  8. AI接口实现:简单实现Viper配置管理

    简介 前面实现的一个简易suno-api.是使用cookie来获取suno-token发起请求的.当时并没有通过配置的方式来获取cookie,而是直接在代码中写死了cookie的值,这种做法并不好,所 ...

  9. SpringBoot的学习

    SpringBoot SpringBoot最核心的东西:自动装配!!! 很重要! 以及他的SpringApplication.run(); 方法 配置用什么写:可以用xml, 和springboot自 ...

  10. CJ20N 增强客户字段 引用别人公众号文章

    引用:PS CJ20N 项目定义属性字段增强 (qq.com) 达成效果: 一.CJ20N添加字段 二.用户出口CNEX0006 CMOD分配CNEX0006 出口EXIT_SAPLCJWB_002 ...