P1966 火柴排队

题意:有两列火柴,各有各的高度,两两高度不同,每次只能交换相邻的数,问最少交换多少次,使得 ∑ ( a i − b i ) 2 \sum (a_i-b_i)^2 ∑(ai​−bi​)2最小。

解法:离散化+树状数组!
因为数据各不相同,可以想到最优的情况一定是最小的对应第二组的最小的,次小的对应次小的,…,那么可以清楚这题跟数字的大小无关,只和相对大小有关,那么能想到离散化,这里是离散化的两种方法,刚开始理解的时候,会错了意思,以为离散化以后,只是把离散化后的值采取p[a[i]]=b[i],所以采用了第二种方法,但是第二种方法离散化以后,不能访问到原数组的下标。仔细想了一下,因为是需要求交换次数的,要展现出相对大小的同时,还要知道原数组中第一小的值位置在哪,第二小的值位置在哪,那么第二种离散化方式用在这题就是错的(只过了一个点)。

代码

#include  <algorithm>
#include  <iostream>
#include  <cstring>
#include  <vector>
#include  <cstdio>
#include  <queue>
#include  <cmath>
#include  <set>
#include  <map>
#include  <bitset>
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (register int i = (n); i < (m); ++i)
#define _rep(n,m,i) for (register int i = (n); i <= (m); ++i)
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
#define PI acos(-1)
#define eps 1e-4
#define rint register int
#define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2)
using namespace std;
typedef long long LL;
typedef pair<LL, int> pli;
typedef pair<int, int> pii;
typedef pair<double, int> pdi;
typedef pair<LL, LL> pll;
typedef pair<double, double> pdd;
typedef map<int, int> mii;
typedef map<LL, int> mli;
typedef map<char, int> mci;
typedef map<string, int> msi;
template<class T>
void read(T &res) {int f = 1; res = 0;char c = getchar();while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); }while(c >= '0' && c <= '9') { res = res * 10 + c - '0'; c = getchar(); }res *= f;
}
const int ne[8][2] = {1, 0, -1, 0, 0, 1, 0, -1, -1, -1, -1, 1, 1, -1, 1, 1};
const LL INF = 1e18;
const int N = 1e5+10;
const LL Mod = 99999997;
const int M = 110;
LL tmp[N], c[N];
int n, cnt;
LL tr[N];
int lowbit(int x) { return x & -x; }
void upd(int p, LL d) {for( ; p <= n; p += lowbit(p) ) tr[p] = (tr[p] + d) % Mod;
}
LL que(int p) {LL r = 0;for( ; p > 0; p -= lowbit(p) ) r = (r + tr[p]) % Mod;return r;
}
struct xx {int v, id;bool operator < (const xx &c) const {return v < c.v;}
}a[N], b[N];
int main() {scanf("%d", &n);_rep(1, n, i) { scanf("%lld", &a[i].v); a[i].id = i; }_rep(1, n, i) { scanf("%lld", &b[i].v); b[i].id = i; }sort(a+1, a+n+1); sort(b+1, b+n+1);_rep(1, n, i) c[a[i].id] = b[i].id;LL ans = 0;_rep(1, n, i)  {upd(c[i], 1); ans = (ans + i - que(c[i]))%Mod;}printf("%lld\n", ans);return 0;
}

P1966 火柴排队题解相关推荐

  1. P1966 火柴排队

    题面:https://www.luogu.org/problem/P1966 本题就是要将a序列第k大的元素和序列b中第k大的元素的位置换成一样的. 那么可以将a,b数组分别离散化,此时只要将a,b数 ...

  2. 洛谷 P1966 火柴排队 —— 思路

    题目:https://www.luogu.org/problemnew/show/P1966 首先,一个排列相邻交换变成另一个排列的交换次数就是逆序对数: 随便画一画,感觉应该是排个序,大的对应大的, ...

  3. 洛谷P1966 火柴排队

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

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

    题目描述 涵涵有两盒火柴,每盒装有n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为 ∑ni=1(ai−bi)2 ∑ i = 1 ...

  5. 洛谷 P1966 火柴排队

    题意 给定2个等长序列a.b,要求通过交换使 \[\sum_{i=1}^{n}(a_i-b_i)^2\] 最小. 分析 看着这个式子,我突然想到了方差.很明显,方差反应数据的波动程度,所以让数据集中就 ...

  6. 洛谷P1966 火柴排队(逆序对)

    题意 题目链接 Sol 不算很难的一道题 首先要保证权值最小,不难想到一种贪心策略,即把两个序列中rank相同的数放到同一个位置 证明也比较trivial.假设\(A\)中有两个元素\(a, b\), ...

  7. 洛谷P1966 火柴排队(cdq分治 + 逆序对)

    2020.6.8 练二分了当然要练练分治,这些基础的处理手段真的还是蛮好用的. 这道题是问ai 和bi的平方和最小,最少需要的相邻的交换次数.手动模拟了一下感觉没什么思路.但是后来注意到每次只能移动相 ...

  8. 洛谷 1966 loj 2069 火柴排队 题解

    博客观赏效果更佳 题意简述 给定两个数列 a , b a,b a,b,长度均为 n ( < = 100000 ) n(<=100000) n(<=100000), a , b a,b ...

  9. [NOIp2013] luogu P1966 火柴排队

    磕了瓶魔爪. 题目描述 你有两个长度为 N N N 的数组 a , b a,b a,b,试重新排列 a a a 数组使得 S = ∑ i = 1 n ( a i − b i ) 2 S=\sum_{i ...

最新文章

  1. 将CSS放头部,JS放底部,可以提高页面的性能的原因
  2. 2月上旬国内域名总量止跌回升 净增长量达8574个
  3. linux系统下用GCC、JAVA和Python编程
  4. 使用脚本在Linux服务器上自动安装Kubernetes的包管理器Helm
  5. nginx php 配置
  6. ftpwebrequest 无法加载或初始化请求的服务提供程序_jvm之类加载机制
  7. [Drupal] How to get the real path of a node, no matter it is a path or a url alias
  8. Spring Retry 重试机制实现及原理
  9. Mybatis构建sql语法
  10. 附上一张公司项目解决方案的工程图
  11. navicat执行.sql文件
  12. 乾颐堂现任明教教主(2014年课程)TCPIP协议详解卷一 第八节课笔记
  13. 企业如何管理软件资产,软件许可证,软件license,license管理,许可管理
  14. 怎么用计算机计算方位角,坐标方位角连续计算 fx-5800计算器编程
  15. 进程的同步和互斥反映了_用信号量解决进程的同步与互斥探讨【持续更新】
  16. 由浅入深学java pdf_由浅入深学Java:基础、进阶与必做260题 PDF_IT教程网
  17. MIUI通知类短信权限的坑
  18. 【已解决】terminate called after throwing an instance of ‘cv::Exception‘,已放弃 (核心已转储)
  19. 如何快速入门成为一名数据分析师
  20. Zigbee网络模型

热门文章

  1. OJ平台“Hello,World!”
  2. VMware的安装和windows_server_2019_x64的安装教程
  3. 简单的用户头像修改功能(springboot后台)
  4. CentOS7磁盘分区及文件系统
  5. 技术人的充电时刻,24个精彩研发案例在等你(含日程)
  6. S3三阶对称群的矩阵表示
  7. flink sql作业报错Timeout of 60000ms expired before the position for partition xxx could be determined
  8. 股市投资必修课二十五--对于需求的一些误解
  9. 表情可字怎么打_思考 | “打工人”爆梗背后的神秘力量是什么?是表情包
  10. 高德地图组件使用总结