2013NOIP普及组真题 4. 车站分级

news/2024/5/18 3:47:47
线上OJ:

一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid=1964

核心思想:

1、原文中提到 “如果这趟车次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠”,如果设停靠站为A,未停靠站为B,则题意隐含公式 A > = B + 1 A >= B+1 A>=B+1。故本题为 差分约束 问题。
2、题中还提到 “输入保证所有的车次都满足要求”,所以本道题的差分约束问题 不存在环。且本题 不存在负权重。故可以采用 拓扑排序
3、由于在采用拓扑排序时,使用的是最短路算法,故需要 建立边。(关于差分约束和拓扑排序,可参见基础题型 一本通:奖金
● 本题中的顶点即为站点,由于隐含公式 A > = B + 1 A >= B+1 A>=B+1,所以要 在不停靠站点和停靠站点之间建立边,且权重为+1
● 由于有n个站点,所以需建立的边的最大数量为 ( n / 2 ) ∗ ( n / 2 ) = n 2 / 4 (n/2)*(n/2) = n^2/4 (n/2)(n/2)=n2/4
● 当 n 达到1000时, n 2 / 4 = 250000 n^2/4 = 250000 n2/4=250000。 也就是说每辆车最多建立 2.5 ∗ 1 0 5 2.5*10^5 2.5105条边,1000辆车就是 2.5 ∗ 1 0 8 2.5*10^8 2.5108 条边,会超时。

● 所以本题需要增加一个 虚拟原点,把不停靠和停靠的站点分割在两边(如下图所示)。这样可以把边的复杂度由 n ∗ m n*m nm 变为 n + m n+m n+m。也就是说,原本 ( n / 2 ) ∗ ( n / 2 ) (n/2)*(n/2) (n/2)(n/2) 的边的数量会变为 ( n / 2 ) + ( n / 2 ) (n/2)+(n/2) (n/2)+(n/2)。也就是说每辆车从最多建立 2.5 ∗ 1 0 5 2.5*10^5 2.5105条边,降到建立1000条边。1000辆车就是 1 0 6 10^6 106 条边,不会超时。

在这里插入图片描述

主流程

在这里插入图片描述

题解代码:
#include <bits/stdc++.h>using namespace std;const int MAXN = 2010;  // 真实站点的编号为 1 ~ n。虚拟站点的编号从 n 后面开始计算,每趟列车建立一个虚拟站点 n+i,最多到 n+mint n, m, ans = 0;
// vis[i]=true 第i个站点被停靠; level[i]表示第i个车站的等级;du[i]表示第i个顶点的入度;e[v][j]=1 表示从v到j存在一条边; w[v][j]=1 表示从v到j的边的权重为1
int vis[MAXN], level[MAXN], du[MAXN], e[MAXN][MAXN], w[MAXN][MAXN];  
queue<int> q;void toposort()
{// step1. 把所有入度为 0 的站点加入队列( n个真实站台 + m个虚拟站台 )for(int i = 1; i <= n + m; i ++){if (du[i] == 0){q.push(i);if(i <= n)  level[i] = 1; // 如果入度为 0 的是真实站点,说明这么多趟车都没有停靠该站点,则该站点等级设为1( 虚拟站台等级为0 )}}// step2. 栈顶元素v出栈;根据边 e[v][j]遍历 v 的每一个后继顶点 jwhile (!q.empty()){int v = q.front();  // 取出栈顶元素,放在 vq.pop();for (int j = 1; j <= n + m; j ++)  // 遍历所有顶点{if (e[v][j])  // 如果 v -> j 存在边{du[j]--;  // 减少 j 点的入度(相当于删除 v->j 这条边)if (du[j] == 0)  // 如果删除 v->j 边后,j 的入度变为 0,则j入栈;同时 level[v] 传递给 level[j]{q.push(j);  level[j] = level[v] + w[v][j];  // j的站点等级 = v的站点等级+边的权重}}}}
}int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= m; i ++){int s, start, en, t; // s:每辆列车有s个站点要停靠。start:起点站,en:终点站scanf("%d", &s);memset(vis, 0, sizeof(vis)); // vis[i]=1 表示第i个站点被停靠; vis[i]=0 表示第i个站点不停靠for(int j = 1; j <= s; j++) // 依次读入该趟列车的每个停靠站点{scanf("%d", &t);   // 存储在tvis[t] = 1;		   // vis[t]标记为停靠if (j == 1)  start = t;  // 第一个读入的是该趟列车的起点站,存储在startif (j == s)  en = t;     // 最后一个读入的是该趟列车的终点站,存储在en(end为关键字,故用en)}for(int j = start; j <= en; j++)  // 对该趟列车起点站和终点站之间的每个站点,根据是否停靠建立与虚拟站点的边{if(vis[j] == 1)  // 如果 j 号站点被停靠,则建立由虚拟站点 n+i 向 真实站点 j 的边,权值为1{e[n+i][j] = 1;	// 建立一条边,由虚拟站台 n+i -> j站台 w[n+i][j] = 1;  // 该边的权重为 1du[j]++;     // 真实站点 j 的入度 ++}else  // 如果 j 号站点没有被停靠,则建立由真实站点 j 向虚拟站点 n+i 的边,权值为0{e[j][n+i] = 1;	// 建立一条边,由 真实站点 j-> 虚拟站点 n+i ,边权为 0w[j][n+i] = 0;  // 该边的权重为 0du[n+i]++;	 // 虚拟站点 n+i 的入度++}}}toposort(); // 拓扑排序for(int i = 1; i <= n; i++)ans = max(ans, level[i]);cout << ans;return 0;
}

http://www.mrgr.cn/p/88048617

相关文章

WPF中轻松生成动态图表:实例详解(MVVM模式)

概述:本文代码示例演示了如何在WPF中使用LiveCharts库创建动态条形图。通过创建数据模型、ViewModel和在XAML中使用`CartesianChart`控件,你可以轻松实现图表的数据绑定和动态更新。我将通过清晰的步骤指南包括详细的中文注释,帮助你快速理解并应用这一功能。 先上效果: 在…

卡片旋转动画效果

效果图如下:html页面<!DOCTYPE html> <html><head><meta charset="utf-8"><title></title><link rel="stylesheet" href="css/index.css" /></head><body><div class="containe…

认识认识DHCP

文章目录 认识认识DHCP一、什么是DHCP&#xff1f;1.1、为什么要使用DHCP&#xff1f;1.2、DHCP是怎么工作的&#xff1f;1.2.1、客户端首次接入网络的工作原理1.2.2、客户端重用曾经使用过的地址的工作原理1.2.3、客户端更新租期的工作原理 二、配置DHCP Server&#xff0c;为…

【开发工具】pythontutor——在线内存可视化工具

笔者在学习RISC-V时&#xff0c;希望找到一款可视化的内存工具&#xff0c;遗憾目前还未找到。发现了pythontutor这个网站&#xff0c;可以对C、python等多种语言进行内存可视化。结果似乎是x86架构的&#xff0c;符合小端存储。 贴一下网址&#xff0c;原准备依据开源版本进行…

制作一个能构建 dotnet AOT 的 gitlab runner 的 Debian docker 镜像

我的需求是需要有一个能够构建出 dotnet 的 AOT 包的环境,要求这个环境能解决 glibc 兼容依赖的问题,能打出来 x64 和 arm64 的 AOT 的包,且能够运行 gitlab runner 对接自动构建需求 以下是我列举的需求支持制作能在 UOS 系统和麒麟系统上运行的包 支持制作出来的包是 AOT …

CSS + HTML

目录 一.CSS&#xff08;层叠样式表&#xff09; 二. CSS 引入方式 三.选择器 3.1 标签选择器 3.2 类选择器 3.3 id选择器 3.4 通配符选择器 3.5 画盒子 四.文字控制属性 4.1字体大小 4.2字体粗细 4.3 字体倾斜 4.4行高 4.5行高--垂直居中 4.6 字体族 4.7 字体复…

leaflet知识点:地图窗格panes的应用

一&#xff0c;需求背景 地图中存在无人机&#xff0c;停机坪&#xff0c;航线三个图层&#xff0c;需要实现无人机图层显示在最上面&#xff0c;停机坪图层显示在最下面&#xff0c;航线图层显示在中间。 二&#xff0c;遇到问题 由下图可知航线图层所在overlayPane窗格的z-…

LINUX命令行书写规则

Linux在命令、选项、参数、需要添加空格区分,可以是单个或者多个空格。连续的空格在Linux中按照一个空格处理 Linux 命令区分大小写 报错:Command not found 命令未找到说明两种情况 1.内部没有这个命令 命令打错了 2.外部命令也没有这个命令,在确认命令没有打错的情况下,…

笔记:编写程序,分别采用面向对象和 pyplot 快捷函数的方式绘制正弦曲线 和余弦曲线。 提示:使用 sin()或 cos()函数生成正弦值或余弦值。

文章目录 前言一、面向对象和 pyplot 快捷函数的方式是什么&#xff1f;二、编写代码面向对象的方法&#xff1a;使用 pyplot 快捷函数的方法&#xff1a; 总结 前言 本文将探讨如何使用编程语言编写程序&#xff0c;通过两种不同的方法绘制正弦曲线和余弦曲线。我们将分别采用…

JAVA下唯一一款搞定OLTP+OLAP的强类型查询这就是最好用的ORM相见恨晚

JAVA下唯一一款搞定OLTP+OLAP的强类型查询这就是最好用的ORM相见恨晚 介绍 首先非常感谢 FreeSQL 提供的部分源码,让我借鉴了不少功能点,整体设计并没有参考FreeSQL(因为java压根没有expression所以没办法参考)只是在数据库方言上FreeSQL提供的SQL让我少走了很多弯路,所以才让e…

Vue3+Nuxt3 从0到1搭建官网项目(SEO搜索、中英文切换、图片懒加载)

Vue2Nuxt2 从 0 到1 搭建官网~ 想开发一个官网&#xff0c;并且支持SEO搜索&#xff0c;当然离不开我们的 Nuxt &#xff0c;Nuxt2 我们刚刚可以熟练运用&#xff0c;现在有出现了Nuxt3&#xff0c;那通过本篇文章让我们一起了解一下。 安装 Nuxt3 // npx nuxilatest init &…

JAVA系列 小白入门参考资料 继承

目录 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 父类成员访问 4.1 子类中访问父类的成员变量 1. 子类和父类不存在同名成员变量 2. 子类和父类成员变量同名 4.2 子类中访问父类的成员方法 1. 成员方法名字不同 2. 成员方法名字相同 ​5. super关键字 …

护航智慧交通安全 | 聚铭精彩亮相2024交通科技创新及信创产品推广交流会

4月26日&#xff0c;石家庄希尔顿酒店内&#xff0c;河北省智能交通协会盛大举办2024年度交通科技创新及信创产品推广交流会。聚铭网络受邀参与&#xff0c;携旗下安全产品及解决方案精彩亮相&#xff0c;为智慧交通安全保驾护航。 为深化高速公路创新驱动发展战略&#xff0…

VS2019配合QT5.9开发IRayAT430相机SDK

环境配置 VS2019 QT5.9 编译器版本 MSVC2017_64添加系统环境变量&#xff08;完毕后重启电脑&#xff09; 从VS2019中下载Qt插件 从VS2019中添加单个编译组件 上述操作完成后用VS打开工程文件&#xff0c;工程文件地址 &#xff1a; C:\Users\86173\Desktop\IRCNETSDK_W…

贝叶斯统计实战:Python引领的现代数据分析之旅

贝叶斯统计这个名字取自长老会牧师兼业余数学家托马斯贝叶斯(Thomas Bayes&#xff0c;1702—1761)&#xff0c;他最先推导出了贝叶斯定理&#xff0c;该定理于其逝世后的1763年发表。但真正开发贝叶斯方法的第一人是Pierre-Simon Laplace(1749—1827)&#xff0c;因此将其称为…

【Redis 开发】多级缓存,本地进程缓存Caffeine

多级缓存 多级缓存本地进程缓存CaffeineCaffeine三种缓存驱逐策略 多级缓存 Redis处理并发的能力是非常强大的&#xff0c;但是tomcat的支持并发的能力跟不上Redis的性能&#xff0c;导致整体性能的下降 Redis缓存失效时&#xff0c;会对数据库产生冲击&#xff0c;之间再无屏…

网络层 --- IP协议

目录 1. 前置性认识 2. IP协议 3. IP协议头格式 3.1. 4位版本 3.2. 4位首部长度 3.3. 8位服务类型 3.4. 16位总长度 3.5. 8位生存时间 TTL 3.6. 8位协议 3.7. 16位首部检验和 3.8. 32位源IP和32位目的IP 4. 分片问题 4.1. 为什么要分片 4.2. 分片是什么 4.2.1. …

【源代码】使用Vision Pro远程操控机器人

1、OpenTeleVision 是一个开源项目&#xff0c;提供远程操作功能 2、可以从 VisionPro 或 Meta Quest 3 中流式传输头部、手部和腕部数据 3、可以将实时立体视频从摄像头流式传输到 VR 设备 4、需要在 Ubuntu 机器上安装 Zed SDK 和 mkcert&#xff0c;以便在本地进行测试 …

牛客NC320 装箱问题【中等 动态规划,背包问题 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/d195a735f05b46cf8f210c4ad250681c 几乎完全相同的题目&#xff1a; https://www.lintcode.com/problem/92/description 思路 动态规划都是递归递推而来。php答案是动态规划版本&#xff0c;递归版本有 测试用…

02 - 步骤 Kafka consumer

简介 Kafka consumer 步骤&#xff0c;用于连接和消费 Apache Kafka 中的数据,它可以作为数据管道的一部分&#xff0c;将 Kafka 中的数据提取到 Kettle 中进行进一步处理、转换和加载&#xff0c;或者将其直接传输到目标系统中。 使用 场景 我需要订阅一个Kafka的数据&…