【POJ No. 3067】 公路交叉数 Japan

news2024/11/28 22:54:29

【POJ No. 3067】 公路交叉数 Japan

北大 OJ 题目地址

在这里插入图片描述

【题意】

东海岸有N 个城市,西海岸有M 个城市(N ≤1000,M ≤1000),将建成K 条高速公路。每个海岸的城市从北到南编号为1, 2, ……每条高速公路都是直线,连接东海岸的城市和西海岸的城市。建设资金由高速公路之间的交叉数决定。

两个高速公路最多在一个地方交叉。请计算高速公路之间的交叉数量。

【输入输出】

输入:

输入文件以T 为开头,表示测试用例的数量。每个测试用例都以3个数字N 、M 、K 为开头。下面K 行中的每一行都包含两个数字,表示由高速公路连接的城市号。

第1个是东海岸的城市号,第2个是西海岸的城市号。

输出:

对每个测试用例,都单行输出“Test case x : s ”,x表示输入样例编号,s 表示交叉数。

【样例】

在这里插入图片描述

【思路分析】

根据输入样例分析,一共有5个交叉点。

在这里插入图片描述

那么,怎么求交叉点呢?首先搞清楚交叉点是怎么产生的。当两条边的城市号都以升序(或降序)形式出现时,不产生交叉点。例如1 2和2 3不会产生交叉点

在这里插入图片描述

1 4和2 3会产生交叉点,因为西海岸城市1、2是升序的,东海岸城市4、3是降序的。

在这里插入图片描述

因此交叉点的产生原因和逆序对有关系,所以转变为求解逆序对问题。

【算法设计】

① 对输入的边按照x 升序排列,若x 相等,则按y 升序排列。

② 检查每条边i ,统计y 的前缀和sum(e[i ].y ),该前缀和是前面比y 小的正序数,边数减去正序数,即可得到逆序数i -sum(e[i].y ),ans累加逆序数。

③ 将树状数组中e[i ].y 的值加1。

【举个栗子】

根据输入样例,其交叉点求解过程如下。

① 对输入的边按照x 升序,若x 相等,则按y 升序。

排序结果:

在这里插入图片描述

② 按照排序结果检查每条边i ,统计y 的前缀和sum(e[i ].y),将ans累加i -sum(e[i ].y )。

  • i =0:1 4=。sum(4)0,i -sum(4)=0;1的前缀和为0,说明1前面没有数,因为前面还没有输入边,所以逆序边数量ans=0。
    在这里插入图片描述

  • i =1:2 3。sum(3)=0,i -sum(3)=1。3的前缀和为0,说明3前面没有数,所以前面的1条边是逆序的,当前边和逆序边会产生交叉点,累加逆序边数量ans=1。
    在这里插入图片描述

  • i =2:3 1。sum(1)=0,i -sum(1)=2。1的前缀和为0,说明1前面没有数,因此前面的两条边是逆序的,当前边和每条逆序边会产生交叉点,累加逆序边数量ans=3。
    在这里插入图片描述

  • i =3:3 2。sum(2)=1,i -sum(2)=2;前面的3条边已经有1条边是正序的,将该边减去,其余两条边是逆序的,当前边和每个逆序边都会产生交叉点,累加逆序边数量ans=5。
    在这里插入图片描述

【算法实现】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1010
#define maxk 1000010
#define lowbit(x) (x)&(-x)

int c[maxn],kas,n,m,k;

using namespace std;

typedef long long LL;
struct Edge {
    int x, y;
}e[maxk];

bool cmp(Edge a,Edge b)
{
    return a.x<b.x||(a.x==b.x&&a.y<b.y);
}

void add(int i)//加1操作,参数省略
{
    while(i<=m)//y点有m个
	{
        ++c[i];
        i+=lowbit(i);
    }
}

int sum(int i)
{
    int s=0;
    while(i>0)
	{
        s+=c[i];
        i-=lowbit(i);
    }
    return s;
}

int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
	{
		memset(c,0,sizeof(c));
	    scanf("%d%d%d",&n,&m,&k);
	    for(int i=0;i<k;i++)
			scanf("%d%d",&e[i].x,&e[i].y);
	    sort(e,e+k,cmp);
	    LL ans=0;
	    for(int i=0;i<k;i++){
	        ans+=i-sum(e[i].y);
	        add(e[i].y);
	    }
	    printf("Test case %d: %lld\n",++kas,ans);
	}
	
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络---TCP流量控制和拥塞控制

&#xff08;一&#xff09; TCP 流量控制 TCP提供流量控制服务来消除发送方&#xff08;发送速率太快&#xff09;使接收方缓存区溢出的可能性&#xff0c;因此 流量控制是一个速度匹配服务&#xff08;让发送方慢一点&#xff0c;要让接收方来得及接收&#xff0c;实现匹配发…

Qt编写物联网管理平台(支持win/linux/mac/嵌入式linux/modbus等)

一、前言 这个物联网综合管理平台前后迭代了五年&#xff0c;一点一滴慢慢积累起来&#xff0c;从最开始的只有modbus串口协议解析以及简单的表格显示数据&#xff0c;慢慢的逐渐增加了tcp_rtu支持&#xff0c;用户管理模块&#xff0c;地图监控模块&#xff0c;而后为了拓展性…

消息队列 RabbitMQ入门:Linux(Docker)中安装和卸载RabbitMQ服务

文章目录前言一、Linux中安装RabbitMQ下载Erlang下载RabbitMQ进入Linux进行安装启动RabbitMQ二、RabbitMQ Web管理页面安装RabbitMQ Web管理页面访问管理页面三、使用Docker安装RabbitMQ安装Docker安装启动RabbitMQ访问管理页面四、Linux卸载RabbitMQ相关卸载RabbitMQ卸载Erlan…

第41讲:MySQL内置的QL性能分析工具

文章目录1.SQL性能分析的概念2.分析数据库中SQL的执行频率3.数据库中的慢查询日志3.1.开启慢查询日志功能3.2.模拟慢SQL查询观察日志内容4.Profile查看SQL每个阶段的耗时4.1.开启Profile操作4.2.随便执行一些查询语句4.3.查询执行SQL的耗时4.4.查询某一条SQL每个阶段的耗时4.5.…

【ASM】字节码操作 工具类与常用类 InstructionAdapter 介绍

文章目录 1.概述1.1 为什么会有 InstructionAdapter类?2. InstructionAdapter2.1 class info2.2 fields2.3 构造方法2.4 methods3.示例3.1预期目标4.总结1.概述 在上一节:【ASM】字节码操作 工具类与常用类 AnalyzerAdapter 工作原理 我们学习了AnalyzerAdapter类的工作原理…

【OpenCV 例程 300篇】246. 特征检测之ORB算法

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】246. 特征检测之ORB算法 特征检测与匹配是计算机视觉的基本任务&#xff0c;包括检测、描述和匹配三个相互关联的步骤。广泛应用于目标检测、图像检索、视频跟踪和三维重建等诸多领域。 6.9.1 ORB 算…

【Hack The Box】linux练习-- SneakyMailer

HTB 学习笔记 【Hack The Box】linux练习-- SneakyMailer &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月23日&#x1f334; &…

函数调用在嵌入式架构设计中的应用

函数调用很好理解&#xff0c;即使刚学没多久的朋友也知道函数调用是怎么实现的&#xff0c;即调用一个已经封装好的函数&#xff0c;实现某个特定的功能。 把一个或者多个功能通过函数的方式封装起来&#xff0c;对外只提供一个简单的函数接口&#xff0c;然后在其他地方调用即…

SpringCloud - Config分布式配置中心

文章目录一.概述1. 分布式系统面临的配置问题2. 什么是配置中心3. 配置中心怎么用4. 配置中心能做什么二.Config服务端配置与测试1. 搭建1.1 在github上创建一个springcloud_config的新仓库1.2 获得新仓库的地址&#xff1a;1.3 本地硬盘目录上新建git仓库并clone1.4 创建文件1…

设置一个不能被继承的类

小屋杂谈&#xff0c;记录日常 方法1&#xff1a; 如果想让这个类不能被继承&#xff0c;可以把这个类的构造函数设置成私有&#xff0c;这样子类去继承他构造就会报错&#xff0c;这样的话这个类就是不能被继承的&#xff0c;如果需要用这个类的对象的话&#xff0c;在基类里…

机器学习中的交叉熵

文章目录一、背景二、概率论基础知识三、熵≈信息熵&#xff08;应用领域不同&#xff09;、相对熵KL散度、交叉熵、softmax、sigmoid、交叉熵损失图像分割如何理解CrossEntropyLoss()参考资料一、背景 学习机器学习过程中&#xff0c;总是会遇到交叉熵这个名词。通过交叉熵损…

SpringBoot整合knife4j

1.1 Swagger 前后端分离开发&#xff1a;前端和后端分开进行开发&#xff0c;2个项目&#xff0c;一个是前端项目&#xff0c;一个是后端项目 目前基本上很多小项目都是前后端分离&#xff0c;除了后台管理系统 前后端分离开发&#xff0c;前端(app、小程序、智能硬件等)怎么…

栈(C语言实现)

文章目录&#xff1a;1.栈的概念2.栈的结构3.接口实现3.1初始化栈3.2判断栈是否为空3.3压栈&#xff08;入栈&#xff09;3.4出栈3.5查看栈顶元素3.6统计栈内元素个数3.7销毁栈1.栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操…

Credly 数字证书

Credly 数字证书 Credly 简介 通过 Credly 颁发的徽章是对学习成果、经验或能力的数字表述。Credly 数字证书包括常见的组织徽章&#xff0c;如&#xff1a;AWS, Adobe, Autodesk, Certiport, Microsoft, CISCO, IBM 等等&#xff0c;以一种简单和安全的方式在线分享和验证&a…

基于改进人工蜂群算法的K均值聚类算法(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

基于SEIRD和元胞自动机(CA)模型的传染病发展趋势预测

目录前言一、模型假设二、符号说明三、SEIRD模型1. 模型求解四、元胞自动机&#xff08;CA)模型1. 模型求解2. 城市居民减少外出对疫情发展的影响3. 城市间人口流动对疫情发展的影响五 基于防疫政策的修正模型2 “全民戴口罩”“早发现&#xff0c;早隔离”“全民打疫苗”总结前…

Jsonp跨域的坑,关于jsonp你真的了解吗

先来介绍Jsonp跨域 Jsonp全称是Json with Padding&#xff0c;和Json没有关系 Json是一种数据交换格式&#xff0c;而Jsonp是一种依靠开发人员聪明才智创造出的一种费官方跨域数据交换协议。json是描述信息的格式&#xff0c;jsonp是信息传输的协议 在页面上直接发送一个跨域的…

树莓派之树莓派系统安装

树莓派系统安装 概述 树莓派(是为学习计算机编程教育而设计)&#xff0c;只有信用卡大小的微型电脑&#xff0c;其系统基于Linux。随着Windows 10 IoT的发布&#xff0c;我们也将可以用上运行Windows的树莓派。2014年刚知道有树莓派的时候好奇买了一块&#xff0c;型号&#x…

DSP-IIR滤波器设计

目录 滤波器的性能指标&#xff1a; 常用的模拟滤波器&#xff1a; 巴特沃斯滤波器&#xff1a; 巴特沃斯滤波器设计——一般已知Ωp及其衰减指标,Ωs及其衰减指标求得A&#xff0c;ε&#xff0c;N&#xff0c;Ωc&#xff1a; 巴特沃斯滤波器设计例题&#xff1a; 切比…

Python系列-Django

文章目录Python系列-Django用django实现社交媒体 social_book基本演示&#xff0c;点击可查看视频整体项目的创建数据库设计&#xff0c;基本用户创建表的设计 models.py创建用户查看数据库插件 database navigator登录、注册的实现用djangovue实现社交媒体 social_bookPython系…