公路交叉数(POJ3067)-树状数组解决逆序对

news2024/10/5 13:35:05

题目大意
东海岸有N个城市,西海岸有M个城市(N≤1000,M≤1000),将建K条公路。每个海岸的城市从北到南编号为1,2,…每条高速公路都是直线,连接东海岸和西海岸的城市。建设资金由高速公路之间的交叉数决定。两个高速公路最多在一个地方交叉。请计算告诉公路之间的交叉数量。

输入:
输入以T开始,表示测试用例的数量。
每个测试用例都是3个整数N、M、K。
下面的K行每一行都包含两个数字,表示高速公路连接的城市号。第一个数是东海岸的城市号,第二个数字是西海岸的城市号。

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

输入样例:
1
3 4 4
1 4
2 3
3 2
3 1
输出样例:
Test case 1:5

题解:
根据样例,一共有5个交叉点,如下图
在这里插入图片描述
我们探讨一下怎么产生的交叉点,如果两边的城市都是以升序(降序)出现,我们发现就不会产生交叉点。
例如,1 2 和 2 3 就不会产生交叉点。
在这里插入图片描述
1 4 2 3就会产生交叉点,因为西海岸城市1、2是升序的,东海岸城市4、3是降序的。因此产生交叉和逆序对有关系。
在这里插入图片描述
通过上面分析,求交叉的数量,就是把公路两端的城市号,一端升序排列,另一端求逆序对的个数。

算法设计:
1、对数的边按照x升序排列,若x相等,则按有升序排列。
2、检查每条边i,统计y的前缀和sum(e[i].y),该前缀和是前面比y小的正序数,即可得到逆序数为i-sum(e[i].y),也就是前面的边和第i条边产生交叉的个数,ans累加这个交叉个数。
3、将树状数组中的e[i].y的值加1。

算法图解:
1、对边排序结果:
1 4
2 3
3 1
3 2

2、按照排序结果检查每条边i,统计y的前缀和sum(e[i].y),将ans累加i-sum(e[i].y)。
i=0: 1 4,sum(4)=0,i-sum(4)=0;4的前缀和为0,说明4前面没有比4小的数,因为前面还没有边,所以逆序对ans=0。

在这里插入图片描述
i=1: 2 3,sum(3)=0,i-sum(0)=1。3的前缀和为0,说明3前面没有数,所以前面的1条边是逆序的,当前边和逆序边会产生交点,累加逆序边数量ans=1。
(sum()始终是统计的正序数)。
在这里插入图片描述
i=2: 3 1。sum(1)=0,i-sum(1)=2。1的前缀和为0,说明1前面没有正序数(也就是比1小的数),因此前面出现的两条边都是逆序的,当前边和每条逆序边会产生交点。累加逆序边数量ans=3
在这里插入图片描述
i=3: 3 2。sum(2)=1,i-sum(2)=2;前面的三条边已经有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);
			/*
			表示以y端点的边出现一次,更新c[y],利用树状数组机制,更新后面
			关联的c[ ],表示后面比y大的数正序数都会增加1。
			c[y]先使用,后更新,主要是为更新比y大的数, 
			*/ 
	    }
	    printf("Test case %d: %lld\n",++kas,ans);
	}
    return 0;
}

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

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

相关文章

各开发语言DNS缓存配置建议

作者&#xff1a;翟贺龙 一、背景 在计算机领域&#xff0c;涉及性能优化动作时首先应被考虑的原则之一便是使用缓存&#xff0c;合理的数据缓存机制能够带来以下收益&#xff1a; 1.缩短数据获取路径&#xff0c;热点数据就近缓存以便后续快速读取&#xff0c;从而明显提升…

小侃设计模式(十六)-备忘录模式

1.概述 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型模式&#xff0c;它的主要思想是在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并将该状态保存在该对象之外&#xff0c;这样以后就可将该对象恢复到原先保存的状态。它是相对简…

【项目问题】程序里,oracle相关的内容,为什么有些能显示表有些不能显示表,但是用oracle工具就可以看到所有表

运行过程中的问题客户提出问题找一下原因问题找到了那如何解决这个看不到的问题呢客户提出问题 1、oracle数据源链接成功了&#xff0c;但是在产品使用过程中发现&#xff0c;没有表&#xff0c;空空如也 找一下原因 先看一下用户&#xff1a;zd202207 2、再去看看数据库工…

效率倍增!5款超级好用的Python工具库!

Python 是一门简单易学却功能非常强大的语言。好玩实用的工具层出不穷&#xff0c;也给我们的工作生活带来极大的方便。在之前文章中我已多次分享过一些实用的工具&#xff0c;有兴趣的可以翻阅一下&#xff0c;今天我再分享 5 款非常实用的工具: LuxTranslatorsTextShotFancy…

C规范编辑笔记(六)

往期文章&#xff1a; C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) 正文&#xff1a; 今天我们继续来分享一下我们C规范编辑笔记第六篇~ 话不多说&#xff0c;我们直接来看&#xff1a; 1、 结构体变量不得在未指定初始化…

华为云大数据BI 为中小型企业智慧运营保驾护航

华为云大数据BI 为中小型企业智慧运营保驾护航 企业数字化转型中&#xff0c;必然面临信息数据潜在价值变现的问题&#xff0c;在解决这一问题的途中&#xff0c;企业可能面临多种困难&#xff0c;尤其是信息数据分析&#xff0c;这直接关系到企业能否实现潜在价值变现。对于小…

[附源码]Python计算机毕业设计Django疫情管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

chrome新特性-recorder

chrome新特性-recorder一、简介二、录制三、录制回放1.Chrome DevTool工具2.Puppeteer脚本(1) 介绍(2) 使用一、简介 recorder 与Selenium IDE浏览器插件类似&#xff0c;可用于自动化测试及脚本生成(Puppeteer脚本);前者为Web自动化测试框架Selenium的配套浏览器插件支持Java、…

一文学会所有Web应用安全知识点

据调查大部分网络安全事故是软件缺陷导致的网络攻击。由于应用程序代码漏洞和安全漏洞&#xff0c;我们的企业正在遭受越来越多的攻击。调查显示攻击者可以通过盗用凭证&#xff0c;攻击10个测试过的web应用程序中的9个&#xff0c;进行恶意软件注入以及网络钓鱼攻击。因此&…

QuTrunk与MindSpore量子神经网络初探

QuTrunk是启科量子开发和已经开源的一款量子编程框架软件产品&#xff0c;关于QuTrunk的详细介绍&#xff0c;用户可以访问启科的开发者社区站点详细了解&#xff0c;也可以进入github上此项目下进行查询。 QuTrunk开发框架是可以与第三方AI框架深度结合进行量子计算程序开发的…

安装 Unity 个人免费版

安装 Unity 个人免费版 正版是需要收费的&#xff0c;所以我们个人开发使用个人免费版就可以 一、下载Unity 1.打开unity官网 点击”下载Unity" 官网 https://unity.cn/releases 2.下拉&#xff0c;会有各种版本&#xff0c;进入Unity的下载页面&#xff0c;找到对应的版…

Nacos2.1.2+Seata1.5.2+Mysql8+SpringCloud+Feign实现分布式事务笔记

搭建环境可以使用docker或是手动自己构建 1.启动nacos服务&#xff0c;nacos/nacos登录http://nacos-ip:8848 2.修改Seata的配置文件&#xff0c;注册到nacos上&#xff1a; seata\conf\application.yml server:port: 7091spring:application:name: seata-serverlogging:con…

VS调试安卓Unity应用

最近遇到了一个bug&#xff0c;需要在安卓手机上实机调试才行&#xff0c;所以这里记录一下怎么用VS调试安卓应用。我使用的VS是2017&#xff0c;但是更新的2019等版本应该也是差不多的&#xff08;毕竟实际上依赖的是Visual Studio Tools for Unity插件&#xff09;。Unity版本…

管理RMAN备份_管理恢复目录(Recovery Catalog)

本章阐述如何管理RMAN恢复目录。Catalog是一个数据库模式&#xff0c;它包含一个或多个目标数据库的RMAN仓库数据。 1&#xff0e;RMAN恢复目录概述 本节阐述与管理恢复目录相关的基本概念。 1.1&#xff0e;RMAN恢复目录的目的 恢复目录是一个数据库模式&#xff0c;RMAN使…

OutOfMemory内存溢出问题排查

OutOfMemory内存溢出问题排查 错误 2022-12-06 00:43:53.296[,] [registrationTask1] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler.handleError96 - Unexpected error occurred in scheduled task. java.lang.OutOfMemoryError: Java heap space 2022-12-06 00:42:49.…

密码技术学习一:密码

0、前言 本文是作者阅读《图解密码技术》时&#xff0c;学习总结的一些知识&#xff0c;在此推荐想要深入学习密码知识的同志&#xff0c;将此书作为入门书来看还是比较适合的。 1、密码技术简介 1.1加密与解密 在两者通信过程中&#xff0c;不想通信的内容被第三方知道&am…

在R语言中进行缺失值填充:估算缺失值

介绍 缺失值被认为是预测建模的首要障碍。因此&#xff0c;掌握克服这些问题的方法很重要。最近我们被客户要求撰写关于缺失值处理的研究报告&#xff0c;包括一些图形和统计输出。 估算缺失值的方法的选择在很大程度上影响了模型的预测能力。在大多数统计分析方法中&#xf…

有状态软件如何在 k8s 上快速扩容甚至自动扩容

概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机安装依赖下载安装包按规范配置主机名, hosts配置网络: 包括域名, DNS, 虚 ip, 防火墙...配置监控 今天虚机环境上出现了问题, 是因为 RabbitMQ 资源不足. 手动扩容…

一夜之间火爆GitHub的JavaWeb轻量级开发面试教程,终于浮出水面

前言 学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生…

[附源码]Python计算机毕业设计Django医院门诊管理信息系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…