传送门

考虑如果能确定每个鞋子最终交换到的位置,那么答案容易算出

具体地,如果原位置为 $i$ 的鞋子要交换到 $pos[i]$ 那么最终答案就是 $pos$ 的逆序对数量

如果不懂可以先去写 NOIP2013火柴排队   我的题解也有关于这个的证明

考虑怎么确定最优的方案,容易想到每个鞋子都找离它最近的鞋子匹配,这样是对的

证明(参考博客):

设最终相邻的某两对鞋子 $(a,b) (c,d)$,其中$(a,b)$ 表示这一对鞋子初始的位置为 $a,b$,$(c,d)$ 同理,不妨设 $a<c$ ,

如果 $a<b<c<d$ 那么 $(a,b)(c,d)$ 产生的逆序对数量为 $0$,$(c,d)(a,b)$ 产生的逆序对数量为 $4$

如果 $a<c<b<d$ 那么 $(a,b)(c,d)$ 产生的逆序对数量为 $1$,$(c,d)(a,b)$ 产生的逆序对数量为 $3$

如果 $a<c<d<b$ 那么 $(a,b)(c,a)$ 产生的逆序对数量为 $2$,$(c,d)(a,b)$ 产生的逆序对数量为 $2$

所以如果对于某两对相邻鞋子 $(c,d)(a,b)$ ,且 $a<c$,交换他们不会使方案更劣

所以每次贪心选最近的鞋子匹配即可,具体实现看代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=4e5+;
int n,n2,a[N],pos[N];
ll ans;
bool vis[N];
vector <int> L[N],R[N];//桶
int t[N];
inline void add(int x,int v) { while(x<=n2) t[x]+=v,x+=x&-x; }
inline int ask(int x) { int res=; while(x) res+=t[x],x-=x&-x; return res; }
int main()
{
n=read(); n2=n*;
for(int i=;i<=n2;i++)
{
a[i]=read();
a[i]< ? L[-a[i]].push_back(i) : R[a[i]].push_back(i);
}
for(int i=;i<=n;i++)
{
int len=L[i].size();
for(int j=;j<len;j++)
{
pos[L[i][j]]=R[i][j];
pos[R[i][j]]=L[i][j];
ans+=L[i][j]>R[i][j];//注意细节
}
}
for(int i=;i<=n2;i++) add(i,);
for(int i=;i<=n2;i++)
{
if(vis[i]) continue;
add(i,-); add(pos[i],-);
vis[i]=vis[pos[i]]=;
ans+=ask(pos[i]);//求在它之后的小于等于它的数量
}
//树状数组维护逆序对数量
printf("%lld\n",ans);
return ;
}

LOJ 3175. 「IOI2019」排列鞋子的更多相关文章

  1. Loj #2554. 「CTSC2018」青蕈领主

    Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...

  2. Loj #2719. 「NOI2018」冒泡排序

    Loj #2719. 「NOI2018」冒泡排序 题目描述 最近,小 S 对冒泡排序产生了浓厚的兴趣.为了问题简单,小 S 只研究对 *\(1\) 到 \(n\) 的排列*的冒泡排序. 下面是对冒泡排 ...

  3. Loj #3102. 「JSOI2019」神经网络

    Loj #3102. 「JSOI2019」神经网络 题目背景 火星探险队发现,火星人的思维方式与人类非常不同,是因为他们拥有与人类很不一样的神经网络结构.为了更好地理解火星人的行为模式,JYY 对小镇 ...

  4. Loj #3042. 「ZJOI2019」麻将

    Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...

  5. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  6. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  7. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  8. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  9. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

随机推荐

  1. linux运维、架构之路-CentOS6.9安装Zabbix3.4.1

    一.LAMP环境安装 1.环境 [root@m01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@m01 ~]# uname ...

  2. php开发常用技巧总结

    1.[本地开启xdebug导致执行时间超max_execution_time产生的问题处理方法]xdebug开启,会导php执行速度慢,超max_execution_time,这种情况下有必要合理设置 ...

  3. es之java搜索文档

    1:搜索文档数据(单个索引) @Test public void getSingleDocument(){ GetResponse response = client.prepareGet(" ...

  4. Linux中的atim、mtime、ctime

    - Linux中的atime.mtime.ctime 一.文件中的atime.mtime.ctime 1.含义及各种事件标记的显示方法 atime:最近一次访问文件的时间用ls -lu看到的时间为at ...

  5. Android传感器系统架构【转】

    本文转载自:http://blog.csdn.net/qianjin0703/article/details/5942579 版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 体系结构 2. ...

  6. 源码编译安装Apache/2.4.37-------踩了无数坑,重装了十几次服务器才会的,不容易啊!

    1.先进入/usr/local/中创建三个文件夹 apr apr-util apache cd /usr/local目录 mkdir apr mkdir apr-util mkdir apache 2 ...

  7. 线段树板子1(洛谷P3372)

    传送 一道线段树板子(最简单的) 似乎之前在培训里写过线段树的样子?不记得了 何为线段树? 一般就是长成这样的树,树上的每个节点代表一个区间.线段树一般用于区间修改,区间查询的问题. 我们如何种写一棵 ...

  8. 架构-层-BLL:BLL

    ylbtech-架构-层-BLL:BLL 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的 ...

  9. HDFS——完全分布式搭建

    架构 NN--namenode SNN--secondnamenode DN--datanode hadoop_env.sh中修改JAVA_HOME core-site.xml <propert ...

  10. 树的基本概念以及java实现二叉树

    树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有父节点的结点称为根节点 (3)每一个非根结点有且只有一个父节点 (4)除了根结点外,每个子结点可以分为多个不相交的子树.   树的基本术语 ...