P5749 [IOI2019] 排列鞋子
算是一种新思路吧。
题目要求我们求最少的对调次数,想到了什么?求逆序对个数,我们只需将原来的 \(S_i\) 数组转化一下,求其逆序对个数即可。
转化规则为:从头开始,对于每个还未被赋值的 \(S_i\) 找在它后面离它最近的并于其符号相反的 \(S_i\)。将 \(sum+2\)(其初值为 \(0\)),其中的正数赋值为 \(sum\),负数赋值为 \(sum-1\)。
例如样例一,赋值完毕的数组为:2 4 3 1。
样例二为 1 2 4 3 5 6。
正确性的证明:因为每次找的都是最近的 \(S_i\),所以总交换次数最少。而数组的重新排列保证了左右两只鞋子分配到的数字一定是 \(sum-1\) 与 \(sum\)。此时问题就变成了求将一个无序的序列转化为有序,最少需要几次交换,求逆序对个数即可。
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+7;
map<int,list<int> > m;
int a[N],tr[N],s[N];
bitset<N> vis;
int n;
void upd(int w,int x){
for(int i=w;i<=n;i+=(i&-i)) tr[i]+=x;
}
int query(int x){
int ans=0;
while(x>0){
ans+=tr[x];
x-=(x&-x);
}
return ans;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
n*=2;
for(int i=1;i<=n;i++){
cin>>s[i];
m[s[i]].push_back(i);
}
for(int i=1,sum=0;i<=n;i++){
if(vis[i]) continue;
int j=m[-s[i]].front();//找在它后面离它最近的并于其符号相反的 Si.
m[s[i]].pop_front();
m[s[j]].pop_front();
vis[i]=vis[j]=1;
sum+=2;
if(s[i]<0) a[i]=sum-1,a[j]=sum;
else a[j]=sum-1,a[i]=sum;
}
//树状数组求逆序对。
long long ans=0;
for(int i=1;i<=n;i++) {
upd(a[i],1);
ans+=i-query(a[i]);
cout<<a[i]<<' ';
}
cout<<ans;
return 0;
}
P5749 [IOI2019] 排列鞋子的更多相关文章
- LOJ 3175. 「IOI2019」排列鞋子
传送门 考虑如果能确定每个鞋子最终交换到的位置,那么答案容易算出 具体地,如果原位置为 $i$ 的鞋子要交换到 $pos[i]$ 那么最终答案就是 $pos$ 的逆序对数量 如果不懂可以先去写 NOI ...
- [loj3175]排列鞋子
贪心与最近的鞋子匹配(大小相同且方向相反),记$a_{x}$表示第x双鞋子的左位置,$b_{x}$表示右位置 若$a_{x}>b_{x}$,那么可以交换这两双鞋子并令答案+1,所以不妨设$a_{ ...
- hdu 4451 Dressing 排列组合/水题
Dressing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 学习sql中的排列组合,在园子里搜着看于是。。。
学习sql中的排列组合,在园子里搜着看,看到篇文章,于是自己(新手)用了最最原始的sql去写出来: --需求----B, C, F, M and S住在一座房子的不同楼层.--B 不住顶层.C 不住底 ...
- [LeetCode] Arranging Coins 排列硬币
You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...
- [LeetCode] Next Permutation 下一个排列
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- js学习篇--数组按升序降序排列
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SDOI 2016 排列计数
题目大意:一个数列A,n个元素,其中m个元素不动,其他元素均不在相应位置,问有多少种排列 保证m个元素不动,组合数学直接计算,剩余元素错位排列一下即可 #include<bits/stdc++. ...
- 排列组合算法的javascript实现
命题:从成员数为N的集合S中,选出M个元素,分别求其排列与组合结果集,即 A(N, M)与C(N, M) js解法: function queue(arr, size){ if(size > a ...
- 剑指Offer面试题:26.字符串的排列
一.题目:字符串的排列 题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 二 ...
随机推荐
- cypress 在 typescript 项目中报错找不到 'tslib'
原文链接:https://blog.jijian.link/2020-08-11/cypress-typescript-cannot-find-module-tslib/ cypress 在 type ...
- Alibaba Sentinel SSRF漏洞分析(CVE-2021-44139)
Alibaba Sentinel SSRF漏洞分析(CVE-2021-44139) 一.Alibaba Sentienl 简介 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel ...
- JOKER 低代码平台 20250313 重磅更新:全方位升级,解锁开发新体验
JOKER 低代码平台于 2025 年 3 月 13 日迎来了一次全面且深度的升级.本次更新聚焦前端交互.服务端功能以及通用操作等多个关键领域,致力于打造更卓越的开发环境,为开发者们带来更加高效.稳定 ...
- C++ 常用转换API记录
//wstring转string std::string wstring2string(IN std::wstring& wstr) { std::string result; //获取缓冲区 ...
- OpenGL ES与GLSL ES各版本对应说明
OpenGL ES 3.2 OpenGL ES 3.2 and OpenGL ES Shading Language 3.20 OpenGL ES 3.1 OpenGL ES 3.1 and Open ...
- dxSpreadSheet的报表demo-关于设计报表模板的Datagroup问题
看随机的报表DEMO,主从表也好,数据分组也好.呈现的非常到位. 问题:可是自己在实现数据分组时,一旦设定分组字段就出现了混乱的数据记录. 问题的原因: 看一下一个报表页面设计时需要理清的概念. 页头 ...
- zk源码—6.Leader选举的实现原理
大纲 1.zk是如何实现数据一致性的 (1)数据一致性分析 (2)实现数据一致性的广播模式 (3)实现数据一致性的恢复模式 2.zk是如何进行Leader选举的 (1)服务器启动时的Leader选举 ...
- 微信接龙转Excel
1.新建Excel表格 2.将微信接龙信息复制至表格 3.选择列 4.选择[数据]->[分列] 5.选择[分隔符号]->[下一步] 6.选择[分隔符号]->[下一步] 这里以[空格] ...
- 凯亚物联网平台如何通过MQTT网络组件接入设备
一.概述 有人提议我用kestrel代替Dotnetty ,那是不可能的, 物联网平台MQTT,rtmp,rtsp,httpflv,tcp,udp,rpc 都是基于dotnetty实现,压测没有问题, ...
- 如何在 Linux 上检查开放的端口并关闭不需要的端口
检查服务器开放端口并关闭不必要的端口是网络安全管理中的关键环节,开放端口如同服务器的"窗口",若其中存在未被利用或未受保护的端口,就如同为潜在的攻击者敞开了大门,他们可能会利用这些 ...