洛谷 1966 loj 2069 火柴排队 题解
博客观赏效果更佳
题意简述
给定两个数列 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。是一个类似逆序对的问题,用树状数组维护即珂。
具体思路
先化简一下那个式子。把平方拆开,会发现变成三个部分:
- a i 2 a_i^2 ai2的和
- b i 2 b_i^2 bi2的和
- − 2 a i b i -2a_ib_i −2aibi的和
要让原式最小,那就要让 a i b i a_ib_i aibi的和最大。如何最大呢?那肯定是要排序之后一一对应。
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排列的逆序对数量。树状数组维护即珂。
(上面说这么多,代码其实不长)
实现注意
- 交换次数要 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 火柴排队 题解相关推荐
- 洛谷P5520 [yLOI2019] 青原樱 题解
洛谷P5520 [yLOI2019] 青原樱 题解 题目链接:P5520 [yLOI2019] 青原樱 题意: n n n 个空放 m m m 个物品,两两物品不能直接相邻,至少空一格 纯数学题. 看 ...
- 洛谷P5633 最小度限制生成树 题解
洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...
- 洛谷P2619 [国家集训队]Tree I 题解
洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...
- 洛谷P1282 多米诺骨牌 题解
洛谷P1282 多米诺骨牌 题解 题目链接:P1282 多米诺骨牌 题意: 多米诺骨牌由上下 222 个方块组成,每个方块中有 1∼61\sim61∼6 个点.现有排成行的上方块中点数之和记为 S1S ...
- 洛谷P4084 [USACO17DEC]Barn Painting G 题解
洛谷P4084 [USACO17DEC]Barn Painting G 题解 题目链接:P4084 [USACO17DEC]Barn Painting G 题意:题意:给定一颗N个节点组成的树,3种颜 ...
- 洛谷P3237 [HNOI2014]米特运输 题解
洛谷P3237 [HNOI2014]米特运输 题解 题目链接:P3237 [HNOI2014]米特运输 题意: 这题面是真的长啊 qwq 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为 ...
- 洛谷P4315 月下“毛景树” 题解
洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...
- 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)
洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...
- 洛谷P4287 [SHOI2011]双倍回文 题解
洛谷P4287 [SHOI2011]双倍回文 题解 题目链接:P4287 [SHOI2011]双倍回文 题意: 记字符串 www 的倒置为 wRw^RwR .例如 (abcd)R=dcba(\tt{a ...
最新文章
- redis 的惊群处理和分布式锁的应用例子
- 数据挖掘介绍以及模型参数详解
- ALV 层级分组显示报表
- AAAI 2020 | XIV-ReID:基于X模态的跨模态行人重识别
- 【小代码讲解】独热编码(One-Hot编码)
- Unity3D 重写下拉菜单/Dropdown组件、开启每个按钮可用
- 系统级alias vs Oracle ADR功能
- 我的核心技术都是从哪里学到的?如何提高成长的?分享给大家。
- 事物与数据库底层数据
- DIV+CSS列表式布局(同意图片的应用)
- cmake could not find openssl_使用CMake构建C++项目
- php中怎么让图片没有缓存文件,PHP页面文件缓存,PHP图片缓存实例
- r语言调用python_小众做法,通过python调用R语言的第三方包
- python split()函数
- mybatis原始mapper开发未集成springMVC
- mysql java dbutil_Java -- DBUtils 框架 操作MySQL数据库
- cad卸载_永远不舍得卸载的6款CAD插件,完全免费,让你三小时做一套图!
- 京东php分销系统开源,2017Ecshop鸿宇小京东V7.2.3二次开发版分销多用户商城系统微信支...
- 实时计算交易盈亏、平仓盈亏和浮动盈亏
- UT单元测试总结基础篇
热门文章
- WIFI 信号强度是怎么划分的
- Linux高性能服务器I/0高级应用:非阻塞connect(15)
- Linux下配置NTP时间服务器
- iOS学习笔记-110.多线程09——CGD队列组
- 必看!阿里成功背后的商业秘诀:前线团队尽量小,中台支撑尽量大
- cocos2dx骨骼动画Armature源码分析(三)
- Hive之解析Json数组
- 笔记本电脑点开都是计算机,笔记本电脑程序都打不开
- Photoshop滤镜打造线框特效美术字(转)
- vs2015 c语言安装选项,visual studio(VS2015)路径和工程属性设置