P1966 [NOIP2013 提高组] 火柴排队

news2025/1/12 18:18:53

洛谷的一道原题,方法有很多,树状数组以及排序,对刚学树状数组的人来说用排序会比较好理解。

本题最重要的结论就是,要保证两个数组中相同位置的差最小,但是不一定两个数组中数值相同,所以只需要保证相同位置放的数都是当前数组中第i小的,也就是第一个数组里面第i小数和第二个数组中第i的数放的位置要相同,这个地方搞明白之后,只需要找到最小移动次数,这个时候就简单了用归并排序+逆序对即可。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define x first
//#define y second
#define int long long
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e8 - 3;
const int N = 1e5+ 10;

int n, m;

typedef struct {
	int a, b;
}aa; 

bool cmp(aa a, aa b)
{
	return a.a < b.a; 
} 

int s[N], f[N], g[N], sum; 

void merge_sort(int l, int r)
{
	if(l >= r) return ;
	int mid = l + r >> 1;
	merge_sort(l, mid);
	merge_sort(mid + 1, r);
	
	int i = l, j = mid + 1, k = 0;
	while(i <= mid && j <= r)
	{
		if(s[f[i]] <= s[f[j]]) 
			g[k ++] = f[i ++];
		else
		{
			g[k ++] = f[j ++], sum += mid - i + 1;
			sum %= mod;
		}
			
	}
	while(i <= mid) g[k ++] = f[i ++];
	while(j <= r) g[k ++] = f[j ++];
	for(i = l, j = 0; i <= r; i ++, j ++)
		f[i] = g[j]; 
}
aa o[N], p[N];
inline void sovle()
{
	
	cin >> n;
	for(int i = 0; i < n; i ++) {
		cin >> o[i].a;
		o[i].b = i;
	}
	
	for(int i = 0; i < n; i ++) {
		cin >> p[i].a;
		p[i].b = i;
	}
	
	stable_sort(o, o + n, cmp);
	stable_sort(p, p + n, cmp);
	
	for(int i = 0; i < n; i ++)
		s[i] = p[i].b; // 找出来第二个数组中第i小的数的位置
	for(int i = 0; i < n; i ++)
		f[o[i].b] = i; // 找到第一个数组中每个位置都是第几小的
		
	merge_sort(0, n - 1);	
	cout << sum << endl;
}
signed main(void)
{
    IOS;
    int t = 1;
//  cin >> t;
    while(t --) sovle();
    return 0;
}

 

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

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

相关文章

Kafka - 图解生产者消息发送流程

文章目录 发送原理1. 主线程 (main thread)&#xff1a;2. Sender 线程&#xff1a;3. RecordAccumulator&#xff1a; 发送原理小结重要参数 发送原理 Kafka的Producer发送消息采用的是异步发送的方式。 在消息发送的过程中&#xff0c;涉及到了两个线程:main线程和Sender线程…

vue3 联合搜索

划到下方可以直接观看完整代码 目录 前言 用法 1. 数据绑定和事件处理 2. 列表渲染和条件过滤 解析 完整代码 前言 在现代的前端开发中&#xff0c;Vue.js 是一个非常流行的 JavaScript 框架&#xff0c;用于构建用户界面。Vue 提供了一种简洁的方式来构建交互式和动态的网…

顺序表的定义与实现(数据结构与算法)

一、顺序表的定义 1. 顺序表的定义 #define MaxSize 10 //定义最大长度 typedef struct{ ElemType data[MaxSize]; //用静态的“数组”存放数据元素int length; //顺序表的当前长度 …

【MATLAB源码-第58期】基于蛇优化算法(SO)和粒子群优化算法(PSO)的栅格地图路径规划最短路径和适应度曲线对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法 (Particle Swarm Optimization, PSO) 1. 算法概述 粒子群算法是一种基于群体智能的优化算法&#xff0c;模拟鸟群觅食的行为。算法中的每个粒子代表问题的一个可能解&#xff0c;并且具有位置和速度两个属性。粒…

【计算机网络】什么是HTTPS?HTTPS为什么是安全的?

【面试经典题】 前言&#xff1a; HTTP最初的设计就是用于数据的共享和传输&#xff0c;并没有考虑到数据的安全性&#xff0c;如窃听风险&#xff0c;篡改风险和冒充风险。HTTPS是在 HTTP 的基础上引入了一个加密层。HTTPS通过数据加密&#xff0c;数据完整性检验和身份认证…

ES性能优化最佳实践- 检索性能提升30倍!

Elasticsearch是被广泛使用的搜索引擎技术&#xff0c;它的应用领域远不止搜索引擎&#xff0c;还包括日志分析、实时数据监控、内容推荐、电子商务平台、企业级搜索解决方案以及许多其他领域。其强大的全文搜索、实时索引、分布式性能和丰富的插件生态系统使其成为了许多不同行…

C++求欧拉角(eigen库中暴露的一些问题)

不同顺序欧拉角转旋转矩阵对照公式 eigen库求欧拉角公式 分别试验eigen库自带的matrix.eulerAngles()函数&#xff0c;与根据上述公式推导的两种方法求欧拉角 eigen库求得欧拉角的范围一定是 x − > r o l l x->roll x−>roll方向在 [ 0 , π ] [0,π] [0,π]之间&am…

argparse模块介绍

argparse是一个Python模块&#xff1a;命令行选项、参数和子命令解析器。argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义了所需的参数&#xff0c;而 argparse 将找出如何从 sys.argv &#xff08;命令行&#xff09;中解析这些参数。argparse 模块还会自动生成…

实时数仓-Hologres介绍与架构

本文是向大家介绍Hologres是一款实时HSAP产品&#xff0c;隶属阿里自研大数据品牌MaxCompute&#xff0c;兼容 PostgreSQL 生态、支持MaxCompute数据直接查询&#xff0c;支持实时写入实时查询&#xff0c;实时离线联邦分析&#xff0c;低成本、高时效、快速构筑企业实时数据仓…

笔记本电脑识别不了刻录机,由于设备驱动程序的前一个实例仍在内存中,windows 无法加载这个硬件的设备驱动程序。 (代码 38)

目录 1 问题2 解决 1 问题 笔记本电脑识别不了刻录机&#xff0c;由于设备驱动程序的前一个实例仍在内存中&#xff0c;windows 无法加载这个硬件的设备驱动程序。 (代码 38) 笔记本电脑插入刻录机&#xff0c;一直识别不了&#xff1b; 右边点击属性 这里展示 由于设备驱动…

powerdesigner逆向mysql与pg生成er图

一、逆向mysql数据库 官网下载mysql的ODBC(开放数据库互连) 选择自己对应版本&#xff0c;我的power designer是32位的&#xff0c;需要选择32的ODBC进行下载&#xff0c;不然power designer会监测不到。 双击exe文件&#xff0c;安装ODBC 这个比较简单&#xff0c;就不阐述了…

nu1l-死亡ping命令攻略

book-nu1l docker 虚拟化技术 把传统的虚拟机堪称容器 依赖镜像启动容器&#xff0c;镜像可以理解为模板克隆的虚拟机&#xff0c;删除容器&#xff0c;对镜像没有影响 镜像在云端 本地要使用某个镜像&#xff0c;根据地址&#xff0c;直接从云端拉取 基本命令 # 查看系统…

day14_集合

今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List(ArrayList、LinkedList) 零、 复习 throw和throws什么区别 throwthrows位置方法里面方法签名上怎么写throw 异常对象throws异常类名(多个)作用真正抛出异常对象声明抛出的异常类型 运行时…

【开发篇】一、处理函数:定时器与定时服务

文章目录 1、基本处理函数2、定时器和定时服务3、KeyedProcessFunction下演示定时器4、process重获取当前watermark 前面API篇完结&#xff0c;对数据的转换、聚合、窗口等&#xff0c;都是基于DataStream的&#xff0c;称DataStreamAPI&#xff0c;如图&#xff1a; 在Flink…

【Linux08-进程信号】信号的一生……

今天&#xff0c;带来Linux下进程信号的讲解。文中不足错漏之处望请斧正&#xff01; 是什么 生活中的信号 例子: 红绿灯来电铃声老妈倒数321叫我起床外卖小哥叫我下楼拿外卖 理解: 过程&#xff1a;收到信号 → 分析信号 → 产生信号对应的行为信号不一定会被立即处理&…

Flutter——最详细(Scaffold)使用教程

Scaffold简介 相当于界面的主体&#xff08;类似于安卓最外层PhoneWindow&#xff09;&#xff0c;组件的展示都必须依附于它。 使用场景&#xff1a; 每一个界面都是脚手架&#xff0c;通过它来进行架构实现&#xff0c;优美的布局效果。 属性作用appBar顶部的标题栏body显示整…

Qwt QwtPlotMarker标记类详解

1.概述 QwtPlotMarker类是Qwt绘图库中用于在图表上绘制标记的类。标记可以是垂直或水平线、直线、文本或箭头等。它可用于标记某个特定的位置、绘制参考线或注释信息。 以下是类继承关系图&#xff1a; 2.常用方法 设置标记的坐标。传入x和y坐标值&#xff0c;标记将被放置在…

红黑树--讲解以及详细实现过程

目录 红黑树理解红黑树概念红黑树性质 红黑树实现红黑树图解基础结构实现插入实现 红黑树理解 红黑树概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个…

六零导航页SQL注入漏洞复现(CVE-2023-45951)

0x01 产品简介 LyLme Spage&#xff08;六零导航页&#xff09;是中国六零&#xff08;LyLme&#xff09;开源的一个导航页面。致力于简洁高效无广告的上网导航和搜索入口&#xff0c;支持后台添加链接、自定义搜索引擎&#xff0c;沉淀最具价值链接&#xff0c;全站无商业推广…

前端(二十五)——前端实现 OCR 图文识别的详细步骤与示例代码

&#x1f601;博主&#xff1a;小猫娃来啦 &#x1f601;文章核心&#xff1a;前端实现 OCR 图文识别的详细步骤与示例代码 文章目录 简介确定使用的 OCR API创建前端界面添加图像上传功能发送识别请求和处理识别结果完善代码添加注释结论附录 简介 在现代应用程序中&#xff…