洛谷 P1966 火柴排队(树状数组求逆序)

【逆序对 树状树状 离散化】P1966 [NOIP 2013 提高组] 火柴排队|普及+ 涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum (a_i-b_i)^2$。 其中 $a_i$ 表示第一列火柴中第 $i$ 个火柴的高度,$b_i$ 表示第二列火柴中第 $i$ 个火柴的高度。 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 $10^8-3$ 取模的结 阅读详情

题目描述

涵涵有两盒火柴,每盒装有 nn 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \sum (a_i-b_i)^2∑(ai​−bi​)2

其中 a_iai​ 表示第一列火柴中第 ii 个火柴的高度, b_ibi​ 表示第二列火柴中第 ii 个火柴的高度。

每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,99799,999,997 取模的结果。

输入输出格式

输入格式:

 

共三行,第一行包含一个整数 nn ,表示每盒中火柴的数目。

第二行有 nn 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。

第三行有 nn 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

 

输出格式:

 

一个整数,表示最少交换次数对 99,999,99799,999,997 取模的结果。

 

输入输出样例

输入样例#1: 复制

4
2 3 1 4
3 2 1 4

输出样例#1: 复制

1

输入样例#2: 复制

4
1 3 4 2
1 7 2 4

输出样例#2: 复制

2

说明

【输入输出样例说明1】

最小距离是 0 ,最少需要交换 1次,比如:交换第 1列的前 2 根火柴或者交换第 2 列的前 2 根火柴。

【输入输出样例说明2】

最小距离是 10 ,最少需要交换 2 次,比如:交换第 1 列的中间 2 根火柴的位置,再交换第 2 列中后 2 根火柴的位置。

【数据范围】

对于 10% 的数据, 1 ≤ n ≤ 101≤n≤10 ;

对于 30% 的数据, 1 ≤ n ≤ 1001≤n≤100 ;

对于 60% 的数据, 1 ≤ n ≤ 1,0001≤n≤1,000 ;

对于 100% 的数据, 1 ≤ n ≤ 100,000,0 ≤1≤n≤100,000,0≤ 火柴高度 ≤ maxlongint≤maxlongint

 

思路:

首先对这个式子进行分析。

最后要使\sum (a_i-b_i)^2∑(ai​−bi​)2这个最小,我们可以先对a1,a2,b1,b2来进行分析。

假设原始数列为:

a1,a2

b1,b2

我们如果使得交换之后更优,即(a1-b1)^2+(a2-b2)^2>(a1-b2)^2+(a2-b1)^2

将这个式子进行简单的化简之后可以得到

a1(b1-b2)<a2(b1-b2)

当b1-b2>0时,即

b1>b2,a1<a2此时交换a1,a2更优

当b1-b2<0时,即

b1<b2,a1>a2此时交换a1,a2更优

综上可以发现,最优的答案就是两个数组从小到大排序之后,\sum (a_i-b_i)^2∑(ai​−bi​)2这个是最优的。

但是要使得交换次数最少,就不能这样了。

我们可以发现,这个答案其实是把a数组的数构造成与b数组一样在第i位置的数在自己的数组中是一样的第K大。

所以我们只要构造出这样的数组求出逆序对,逆序对的大小就是a数组变成成与b数组一样第i位置第K大的交换次数。

 

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const int mod=99999997;
ll a[maxn];
ll b[maxn];
int d[maxn];
struct node
{
    ll v;
    int id;
}q[maxn],p[maxn];
bool cmp(node a,node b)
{
    return a.v<b.v;
}
int lowbit(int i)
{
    return i&(-i);
}
void update(int x,ll *c)
{
    while(x<maxn)
    {
        c[x]++;
        c[x]%=mod;
        x+=lowbit(x);
    }
}
ll query(int x,ll *c)
{
    ll ans=0;
    while(x)
    {
        ans+=c[x];
        ans%=mod;
        x-=lowbit(x);
    }
    return ans;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&q[i].v);
        q[i].id=i;
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&p[i].v);
        p[i].id=i;
    }
    sort(q+1,q+1+n,cmp);
    sort(p+1,p+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        d[q[i].id]=p[i].id;//构造出这样的数组
    }
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        update(d[i],a);
        ll a1=i-query(d[i],a);
        ans=(ans+a1)%mod;
    }
    printf("%lld\n",ans);
    return 0;
}

 

5G NR 双连接与载波聚合:PCell、SCell、PScell、SpCell 角色全解析 本文全面解析了5G NR中双连接与载波聚合技术的关键概念,详细介绍了PCell、SCell、PScell和SpCell的角色与功能。通过实际案例和配置示例,帮助读者理解这些小区在提升网络覆盖和速率方面的作用,以及在实际组网中的优化策略。 阅读详情

相关推荐

5G NR上行控制信道PUCCH

一、PUCCH概述 PUCCH用于承载上行控制信息,相比LTE,NR PUCCH支持5种不同的格式,按照时域上所占用的符号数量可以分为短格式和长格式两种,如下表所示,短格式占用1-2个符号,可以承载1-2bit信息,长格式占用4-14个符号,可承载大于2bit的信息。NR引入短格式PUCCH的目的是可以缩短HARQ-ACK反馈的时延,长格式仍然是考虑到持续时间长可以保证覆盖。 NR中,考虑到系...

一个关于5G NR的博客^^ 3万+

洛谷 P1966 火柴排队【树状数组】

题目描述 涵涵有两盒火柴,每盒装有n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为∑ni=1(ai−bi)2∑i=1n(ai−bi)2\sum_{i=1}^n(a_i-b_i)^2 其中aiaia_i表示第一列火柴中第 iii 个火柴的高度,bibib_i表示第二列火柴中第iii个火柴的高度。 每列火柴中相邻两根火柴的...

niiick 242

学习笔记9--智能驾驶的功能安全设计之功能安全设计

本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》。此专栏是关于《自动驾驶系统设计及应用》书籍的笔记.

FUXI_Willard 1795

【算法笔记:分治】火柴排队(归并排序+逆序对+贪心)

火柴排队 Time Limit: 1 Sec Memory Limit: 65535 MB 64bit IO Format: %lld Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同。 两列火柴之间的距离定义为:(a1-b1)2+(a2-b2)2+(a3-b3)2+…+(an-bn)2,其中 ai...

qq_44684599的博客 689

Fluent动网格+滑移网格+重叠网格对比介绍(以震荡水翼flapping foil为例)

初学fluent笔记,本文主要包含: Flapping foil在fluent内的几种实现方式 在哪设置动网格、滑移、重叠网格 flapping的UDF 示例 写在前面:Fluent在预览网格运动/提交计算之前,注意保存一个cas版本。 -------------------------Flapping foil 网格几种组合实现方式:---------------------- 直接重叠网格,overset, 需要建立两个几何part,part要重合。水翼局部区域(component),背景网格(ba

深海民工CFDer 2万+

避开STM32H7的‘保护陷阱’:从Option Byte机制深度解析读写保护原理与预防

本文深度解析STM32H723VGT6的Option Byte保护机制,详细讲解RDP读保护和WRP写保护的工作原理及配置方法,并提供硬件设计防御策略和软件预防性编程技巧,帮助开发者避免误触发保护机制导致芯片锁定的问题。

weixin_33686714的博客 441

牛客——火柴排队(树状数组与归并排、逆序对)

来源:牛客网。

m0_75017568的博客 1454

USB的24脚和12脚TYPEC引脚定义

USB 是一种接口,用于将设备连接到计算机上。通过该连接,计算机可以向设备发送数据或检索来自设备的数据。USB 为开发者提供了一个标准接口,适用于多种不同类型的应用。借助于系统的设计过程,USB 设备易于连接和使用。本应用笔记会使该过程变得更加简单。以下是本应用笔记中会使用的概念:USB 历史USB 架构USB 物理接口USB 速度USB 电源USB 端点USB 通信协议USB 描述符USB 类设备USB 枚举与配置过程。

易板 1万+

【算法】火柴排队(离散化、归并排序)

涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑i=(ai−bi)^2,其中 ai 表示第一列火柴中第 i个火柴的高度,bi表示第二列火柴中第 i个火柴的高度。每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997取模的结果。

weixin_74154742的博客 636

2026华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

2025华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

算法大师! 5万+

微信小程序 - 强力解决播放视频卡顿问题,小程序使用video组件播放视频或第三方视频插件,会出现卡顿或者无法播放的各种奇怪问题(微信小程序苹果ios/安卓播放视频很卡不流畅、视频太长或文件大等情况)

微信小程序视频组件播放卡顿,微信小程序video组件出现无法播放或卡顿,微信小程序video组件播放时会出现卡顿,微信小程序使用video组件播放视频的时候,会出现卡顿或者无法播放的问题,微信小程序安卓视频播放卡顿问题,微信小程序苹果ios手机播放视频不流畅很卡,加cdn还是卡,uniapp播放视频会有明显的卡顿问题,video视频时卡顿不流畅问题,为什么video组件播放视频卡顿?苹果微信小程序通过video组件播放视频时卡顿,怎么解决?微信小程序video组件出现无法播放或卡顿,设置custom-cac

🏆 前端领域优质创作者 1万+

火柴排队(c++实现)

就直接求b中逆序对的数量 就出来了。

zyang654321的博客 630

RISC-V CPU设计(三)---多周期CPU的设计与实现

基本情况 本多周期CPU支持RV32I指令集(fence,ecall,ebreak除外),已通过部分指令的测试,如代码有bug,欢迎指出。 模块划分 代码将CPU划分为以下几个模块: 1.控制单元:ControlUnit 用于产生控制信号,是CPU的大脑,指挥中枢。 2.分支决策单元:BranchUnit 用于决定B型指令是否发生跳转 3.立即数单元:ImmUnit 用于从指令中解析出立即数. 4.寄存器堆:RegisterFile RISC-V的32个寄存器,其中x0寄存器恒为0,不可更改。 5.指令存储

qq_40268672的博客 5542

洛谷P1966 [NOIP 2013 提高组] 火柴排队

每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum (a_i-b_i)^2$。次,比如:交换第 $1 $ 列的前 $ 2$ 根火柴或者交换第。个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。,表示每盒中火柴的数目。

yjfyjfyjf54188的博客 1033

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

洛谷-P1966 火柴排队(归并排序or树状数组求逆序对进阶+离散化)

题目链接 题意: 给你两个数组,相邻两个数字之间可以互换位置,求交换位置至少多少次后可以使得∑(ai-b)^2最小。 思路: 离散化a[i]与b[i]数组后开一个c[i]数组令c[a[i]]=b[i],求c[i]数组的逆序对个数即可。 代码: 树状数组代码: #include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);co

ACkingdom的博客 233

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

2021-09-21

洛谷P1966 [NOIP2013 提高组] 火柴排队 题解 题面 下面是题解: 1.转化问题: 首先,先将题干对“距离”的要求进行转化: 思考什么情况下两个相邻的火柴互换可以 令"距离“缩短。我当时感性思考加上理性 验证(其实就是直觉+碰上了),得出 这样一个结论: 距离最小的方案就是让a[i]与b[i] 在各自序列的大小次序(就是第几大)相同。 说白了,就是a[i]第几大,b[i]就第几大 下面给出我的推导(不一定对啊): (a[i]-b[i])2 +(a[i+1]-b[i+1])2 >(a[

zixiangzhan的博客 143

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NOIP 2013 火柴排队

洛谷 P1966 火柴排队 洛谷传送门 JDOJ 2227: [NOIP2013]火柴排队 D1 T2 JDOJ传送门 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑i=1n(ai−bi)2,其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第...

anhaoti3785的博客 216

[NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度。 每列火柴中相邻两根火柴的位置都可以交...

aua4137的博客 261

P1966 火柴排队(树状数组&离散化)

https://www.luogu.org/problem/P1966 分析问题:要求min{∑(ai2+bi2-2aibi)}=min{∑ai2+∑bi2-∑2aibi},我们需要使ai*bi的值最大即可 关键1:排序不等式的定义就是对于这样两个有序数列,它们的 逆序乘积和<=乱序乘积和<=顺序乘积和 关键2:参考洛谷大佬题解 这样问题就与求逆序对很相似了; 进行离散化即可,然后问题...

_Alexander的博客 285

洛谷P1966 火柴排队

题目描述 涵涵有两盒火柴,每盒装有nn根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:\sum (a_i-b_i)^2∑(ai​−bi​)2 其中a_iai​表示第一列火柴中第ii个火柴的高度,b_ibi​表示第二列火柴中第ii个火柴的高度。 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对10...

m0_60961645的博客 400

[洛谷P1966] 火柴排队

题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有两个序列中每对排名对应的数放在同一位置上是最优策略这个结论 说详细一点,假设\(a_0\)是\(a\)序列中的第\(k\)大,\(b_0\)是\(b\)序列中的第\(k\)大,那么\(a_0\)...

kma_093 158

【CSP2019准备】洛谷-P1966 火柴排队+洛谷-P1908 逆序对

P1966火柴排队 P1908逆序对 火柴排队 显然我们要让a中第i小的对应b中第i小的,粗略想一下,如果一个是2,3,一个是3,4。那么2,3对应3,4比2,3对应4,3来的更好,因为题目中的高度不同,而我们的例子是差最小的极端例子,所以可以得出结论成立。 那么问题来了,怎么一一对应。 先把a,b离散化(打上序号排序),然后根据a序号的顺序排b的序号,此时b的序号,设为数组c,c[i]表示b中c...

NightRaven的博客 263

洛谷 P1966 火柴排队

树状数组

sdfzrlt的博客 583

洛谷 P1966 火柴排队 离散化+归并排序/树状数组

洛谷P1966 https://www.luogu.com.cn/problem/P1966 详细解答

xsh_fu的博客 531

火柴排队:离散化&逆序对

A : 1 3 4 2 code: 1# 3# 4# 2# //这里code表示的是排名,例如1是最小的排第一位,所以是1#;2是第二小的排第二位,所以是2#

睡神的博客 311

洛谷P1966 [NOIP2013 提高组] 火柴排队(树状数组,排序不等式)

之后,我们只要求出位置的逆序对,即为最终答案。排完序之后,我们便可以知道,对于原先的。是一个定值,因此我们只需要最小化。其最后应该移动到哪一个位置上。因为排序不等式,所以当序列。因为我们要使得最终的结果。按从小到大排序之后,

weixin_74754298的博客 1138
上一篇: cf div2 340 E. XOR and Favorite Number(莫队算法)
下一篇: 洛谷 P2344 奶牛抗议 (树状数组+DP)
Timeclimber
博客等级 码龄9年 25粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值