博客观赏效果更佳

题意简述

给定两个数列 a , b a,b a,b,长度均为 n ( < = 100000 ) n(<=100000) n(<=100000), a , b a,b a,b中的数都互不相同。最小化每个数差的平方的和,形式化地,最小化:

然后输出交换次数对 99999997 99999997 99999997取膜的结果。

思路框架

显然,最优的时候就是 a , b a,b a,b都排好序的时候,那么我们把 a , b a,b a,b离散化,都看成 1 , n 1,n 1,n的排列,然后算 b b b需要多少步到 a a a。是一个类似逆序对的问题,用树状数组维护即珂。

具体思路

先化简一下那个式子。把平方拆开,会发现变成三个部分:

  1. a i 2 a_i^2 ai2​的和
  2. b i 2 b_i^2 bi2​的和
  3. − 2 a i b i -2a_ib_i −2ai​bi​的和

要让原式最小,那就要让 a i b i a_ib_i ai​bi​的和最大。如何最大呢?那肯定是要排序之后一一对应。

but…Why?

只考虑 n = 2 n=2 n=2的情况。设有四个数, a , b , c , d a,b,c,d a,b,c,d,满足 a < b a<b a<b且 c < d c<d c<d。然后我们看看是 a c + b d ac+bd ac+bd大还是 a d + b c ad+bc ad+bc大,就珂以证出来上面那个排序了。

作差,得 ( a c + b d ) − ( a d + b c ) = d ( b − a ) + c ( a − b ) = ( a − b ) ( c − d ) (ac+bd)-(ad+bc)=d(b-a)+c(a-b)=(a-b)(c-d) (ac+bd)−(ad+bc)=d(b−a)+c(a−b)=(a−b)(c−d)。由于两个都是负的,所以这个数大于 0 0 0。所以 a c + b d ac+bd ac+bd比 a d + b c ad+bc ad+bc大。证毕。

然后我们要求的问题就是,我们要让 b b b和 a a a一一对应,也就是 b b b的第一小对应 a a a的第一小, b b b的第二小对应 a a a的第二小… b b b的最大值对应 a a a的最大值。

(要解决这个问题,显然要先离散化

我们来分析一下我们的目的是啥。比如 a = 4 , 1 , 2 , 3 , 5 , b = 1 , 2 , 3 , 4 , 5 a={4,1,2,3,5},b={1,2,3,4,5} a=4,1,2,3,5,b=1,2,3,4,5。然后我们要让 b b b中的 4 4 4排在第一个, b b b中的 1 1 1排在第二个… b b b中的 5 5 5排在第 5 5 5个。然后我们先处理出 a a a的反排列,设为 M M M,那么对于所有 i i i, M [ a [ i ] ] = i M[a[i]]=i M[a[i]]=i。然后对于每个 i i i,我们令 b [ i ] = M [ b [ i ] ] b[i]=M[b[i]] b[i]=M[b[i]]。这样,我们就把 b b b中的第 i i i个位置变成了这个位置在最优情况下应该在哪。

现在,我们的目的就变成了变换后的 b b b排列变成 1 , 2 , 3... n {1,2,3...n} 1,2,3...n的最小交换次数。这就是变换后的 b b b排列的逆序对数量。树状数组维护即珂。

(上面说这么多,代码其实不长)

实现注意

  1. 交换次数要 l o n g l o n g longlong longlong

代码

#include<bits/stdc++.h>
using namespace std;
namespace Flandre_Scarlet
{#define N 155555#define mod 99999997#define int long long #define F(i,l,r) for(int i=l;i<=r;++i)#define D(i,r,l) for(int i=r;i>=l;--i)#define Fs(i,l,r,c) for(int i=l;i<=r;c)#define Ds(i,r,l,c) for(int i=r;i>=l;c)#define Tra(i,u) for(int i=G.Start(u),__v=G.To(i);~i;i=G.Next(i),__v=G.To(i))#define MEM(x,a) memset(x,a,sizeof(x))#define FK(x) MEM(x,0)int n;int a[N],b[N];void R1(int &x){x=0;char c=getchar();int f=1;while(c<'0' or c>'9') f=(c=='-')?-1:1,c=getchar();while(c>='0' and c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();x=(f==1)?x:-x;}void Input(){R1(n);F(i,1,n) R1(a[i]);F(i,1,n) R1(b[i]);}int lba(int x){return lower_bound(a+1,a+n+1,x)-a;}int lbb(int x){return lower_bound(b+1,b+n+1,x)-b;}int aa[N],bb[N];class BIT{public:int tree[N];int len;void BuildTree(int _len){len=_len;FK(tree);}void Add(int pos,int val=1){for(int i=pos;i<=len;i+=(i&(-i))){tree[i]+=val;}}int Query(int pos){int ans=0;for(int i=pos;i>0;i-=(i&(-i))){ans+=tree[i];}return ans;}}T;int Map[N];void Soviet(){F(i,1,n) aa[i]=a[i],bb[i]=b[i];sort(a+1,a+n+1);sort(b+1,b+n+1);F(i,1,n) aa[i]=lower_bound(a+1,a+n+1,aa[i])-a,bb[i]=lower_bound(b+1,b+n+1,bb[i])-b;//到此为止是离散化F(i,1,n) Map[aa[i]]=i;//Map: 反排列F(i,1,n) bb[i]=Map[bb[i]];//这之后,b[i]就变成了原本的b[i]应该出现在哪个位置才能和a对上//这往后,求一下bb的逆序对数量即珂。T.BuildTree(n);int ans=0;F(i,1,n){ans+=T.Query(n)-T.Query(bb[i]);//维护逆序对ans%=mod;T.Add(bb[i],1);}printf("%lld\n",ans);}#define Flan voidFlan IsMyWife(){Input();Soviet();}#undef int //long long
}
int main()
{Flandre_Scarlet::IsMyWife();getchar();getchar();return 0;
}

洛谷 1966 loj 2069 火柴排队 题解相关推荐

  1. 洛谷P5520 [yLOI2019] 青原樱 题解

    洛谷P5520 [yLOI2019] 青原樱 题解 题目链接:P5520 [yLOI2019] 青原樱 题意: n n n 个空放 m m m 个物品,两两物品不能直接相邻,至少空一格 纯数学题. 看 ...

  2. 洛谷P5633 最小度限制生成树 题解

    洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...

  3. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  4. 洛谷P1282 多米诺骨牌 题解

    洛谷P1282 多米诺骨牌 题解 题目链接:P1282 多米诺骨牌 题意: 多米诺骨牌由上下 222 个方块组成,每个方块中有 1∼61\sim61∼6 个点.现有排成行的上方块中点数之和记为 S1S ...

  5. 洛谷P4084 [USACO17DEC]Barn Painting G 题解

    洛谷P4084 [USACO17DEC]Barn Painting G 题解 题目链接:P4084 [USACO17DEC]Barn Painting G 题意:题意:给定一颗N个节点组成的树,3种颜 ...

  6. 洛谷P3237 [HNOI2014]米特运输 题解

    洛谷P3237 [HNOI2014]米特运输 题解 题目链接:P3237 [HNOI2014]米特运输 题意: 这题面是真的长啊 qwq 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为 ...

  7. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  8. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  9. 洛谷P4287 [SHOI2011]双倍回文 题解

    洛谷P4287 [SHOI2011]双倍回文 题解 题目链接:P4287 [SHOI2011]双倍回文 题意: 记字符串 www 的倒置为 wRw^RwR .例如 (abcd)R=dcba(\tt{a ...

最新文章

  1. redis 的惊群处理和分布式锁的应用例子
  2. 数据挖掘介绍以及模型参数详解
  3. ALV 层级分组显示报表
  4. AAAI 2020 | XIV-ReID:基于X模态的跨模态行人重识别
  5. 【小代码讲解】独热编码(One-Hot编码)
  6. Unity3D 重写下拉菜单/Dropdown组件、开启每个按钮可用
  7. 系统级alias vs Oracle ADR功能
  8. 我的核心技术都是从哪里学到的?如何提高成长的?分享给大家。
  9. 事物与数据库底层数据
  10. DIV+CSS列表式布局(同意图片的应用)
  11. cmake could not find openssl_使用CMake构建C++项目
  12. php中怎么让图片没有缓存文件,PHP页面文件缓存,PHP图片缓存实例
  13. r语言调用python_小众做法,通过python调用R语言的第三方包
  14. python split()函数
  15. mybatis原始mapper开发未集成springMVC
  16. mysql java dbutil_Java -- DBUtils 框架 操作MySQL数据库
  17. cad卸载_永远不舍得卸载的6款CAD插件,完全免费,让你三小时做一套图!
  18. 京东php分销系统开源,2017Ecshop鸿宇小京东V7.2.3二次开发版分销多用户商城系统微信支...
  19. 实时计算交易盈亏、平仓盈亏和浮动盈亏
  20. UT单元测试总结基础篇

热门文章

  1. WIFI 信号强度是怎么划分的
  2. Linux高性能服务器I/0高级应用:非阻塞connect(15)
  3. Linux下配置NTP时间服务器
  4. iOS学习笔记-110.多线程09——CGD队列组
  5. 必看!阿里成功背后的商业秘诀:前线团队尽量小,中台支撑尽量大
  6. cocos2dx骨骼动画Armature源码分析(三)
  7. Hive之解析Json数组
  8. 笔记本电脑点开都是计算机,笔记本电脑程序都打不开
  9. Photoshop滤镜打造线框特效美术字(转)
  10. vs2015 c语言安装选项,visual studio(VS2015)路径和工程属性设置