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. 二 ...
随机推荐
- https证书中的subject alternative name字段作用及如何生成含该字段的证书
背景 最近,某个运维同事找到我,说测试环境的某个域名(他也在负责维护),假设域名为test.baidu.com,以前呢,证书都是用的生产的证书,最近不让用了.问为啥呢,说不安全,现在在整改了,因为证书 ...
- 0003 Failed to build the application: build go_beego/src/hello: cannot load
我使用beego框架快速建立了一个应用,可当我运行 bee run的时候,出现了如下错误 D:\go_beego\src\product>bee run ______ | ___ \ | |_/ ...
- V8引擎静态库及其调用方法
V8引擎静态库下载地址由于包含了x86和x64的debug和release静态库,所以资源较大,需要耐心下载. 案例编译工具:VS2019 v8开头的即为V8引擎静态库(附送其它开源静态库libuv. ...
- MySQL 事务隔离级别:社交恐惧症的四个阶段
MySQL 事务隔离级别:社交恐惧症的四个阶段 在数据库的世界里,数据们也有社交问题!事务隔离级别就是控制它们互相看到对方的程度... 什么是事务隔离? 想象一下,数据库是一个繁忙的餐厅,每个事务都是 ...
- 【数据结构与算法】找出最小的k个数:三路快速排序算法思想实现
找出最小的k个数:三路快速排序算法思想实现 Java https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/zui-xi ...
- python练习-爬虫
场景: 1.网址hppt://xxx.yyy.zzz.cn2.打开网页后显示 : 3.填上姓名 身份证和验证码,点击查询后,返回查询结果. 4.页面有cookie. 方案一: 程序中嵌入浏览器根据网址 ...
- 图像处理中的 Gaussina Blur 和 SIFT 算法
Gaussina Blur 高斯模糊 高斯模糊的数学定义 高斯模糊是通过 高斯核(Gaussian Kernel) 对图像进行卷积操作实现的. 二维高斯函数定义为 \[G(x, y, \sigma) ...
- STM32串口缓冲区
在嵌入式开发中,外设通信(如UART.SPI.I2C)的数据接收常面临两大挑战:不定时.不定量数据的实时处理和高频率数据流下的稳定性保障.传统的轮询方式效率低下,而中断驱动的接收逻辑又容易因处理延迟导 ...
- C#(如何解决使用enum和struct作为Dictionary的TKey带来的GC
- UGUI 事件穿透使Scrollrect 滚动
public class TouchPenetrate : MonoBehaviour, IPointerClickHandler,IBeginDragHandler,IDragHandler,IPo ...