BZOJ 2058 [Usaco2010 Nov]Cow Photographs:逆序对【环上最小逆序对】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2058
题意:
给你一个由1~n组成的排列,首尾相接围成一个环。
你可以任意次交换其中两个相邻位置的数字。
最终你要让所有数字顺时针递增,只有n顺时针紧邻着1。
问你最小的交换次数。
题解:
举个例子。
有一个由1~5组成的环:2 3 1 4 5
对于这个环,最终答案有若干种情况:
(1)1 2 3 4 5
(2)2 3 4 5 1
(3)3 4 5 1 2
(4)4 5 1 2 3
(5)5 1 2 3 4
每一次变化,无非是分别将1~4移到了最右边。
对于从(1)到(2)的变化,其实就是将原环中的1改为了一个比其他都大的数字(比如6),然后求了一遍逆序对。
对应到最终结果中,也就是1变成了最右边的数。
所以变化之后的答案 = 上一次的答案 - 数字i所贡献的逆序对个数 + 改成的更大的数所贡献的逆序对个数
对于每一次将数字i改为更大的数时,i一定是当前环中最小的数字。
令pos[i]为数字i在原环中出现的位置(1 <= pos <= n)。
所以:
i贡献的逆序对 = pos[i] - 1
更大的数贡献的逆序对 = n - pos[i]
即:res = res - 2*pos[i] + 1 + n
对于所有res取最小即可。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 100005
#define INF 1000000000 using namespace std; int n;
int a[MAX_N];
int l[MAX_N];
int r[MAX_N];
int dat[MAX_N];
int pos[MAX_N];
long long ans=;
long long res=; void read()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a[i];
pos[a[i]]=i;
}
} void merge(int lef,int mid,int rig)
{
int n1=mid-lef+;
int n2=rig-mid;
for(int i=;i<n1;i++) l[i]=a[lef+i];
for(int i=;i<n2;i++) r[i]=a[mid+i+];
l[n1]=INF;
r[n2]=INF;
for(int i=,j=,k=lef;k<=rig;k++)
{
if(l[i]<r[j]) a[k]=l[i++];
else
{
a[k]=r[j++];
res+=n1-i;
}
}
} void merge_sort(int lef,int rig)
{
if(lef==rig) return;
int mid=(lef+rig)/;
merge_sort(lef,mid);
merge_sort(mid+,rig);
merge(lef,mid,rig);
} void solve()
{
merge_sort(,n);
ans=res;
for(int i=;i<n;i++)
{
res=res-*pos[i]++n;
ans=min(ans,res);
}
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}
BZOJ 2058 [Usaco2010 Nov]Cow Photographs:逆序对【环上最小逆序对】的更多相关文章
- Bzoj 2058: [Usaco2010 Nov]Cow Photographs 题解
2058: [Usaco2010 Nov]Cow Photographs Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 190 Solved: 104[ ...
- bzoj2058: [Usaco2010 Nov]Cow Photographs(逆序对)
题目大意:给出n个数的序列,每次可以交换相邻的两个数,问把序列变成编号i在编号i+1左边,编号1在编号n右边(一个环)最少需要多少步.如:35421最少交换两次变为34512. 一开始看到这题,只会O ...
- BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对
BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对 题意: 奶牛的图片 Farmer John希望给他的N(1<=N<=100,000)只奶牛拍照片, ...
- [bzoj2058][Usaco2010 Nov]Cow Photographs_树状数组_动态规划
Cow Photographs bzoj-2058 Usaco-2010 Nov 题目大意:给定一个n的排列.每次操作可以交换相邻两个数.问将序列变成一个:$i,i+1,i+2,...,n,1,2,. ...
- BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛( dp )
树形dp..水 ------------------------------------------------------------------------ #include<cstdio& ...
- BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏( floyd )
直接floyd.. ---------------------------------------------------------------------------- #include<c ...
- BZOJ 1629 [Usaco2005 Nov]Cow Acrobats:贪心【局部证明】
题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1332 题意: 有n头牛在“叠罗汉”. 第i头牛的体重为w[i],力量为s[i]. 一头 ...
- BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏
Description Farmer John 想让她的奶牛准备郡级跳跃比赛,贝茜和她的伙伴们正在练习跨栏.她们很累,所以她们想消耗最少的能量来跨栏. 显然,对于一头奶牛跳过几个矮栏是很容易的,但是高 ...
- BZOJ 1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨栏:新版floyd【路径上最大边最小】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1641 题意: 给你一个有向图,n个点(n <= 300),m条边,边权为h[i]. ...
随机推荐
- Oracle集群和灾备解决方案介绍
Oracle本身有各种各样的解决方案,本文主要是对以下几种解决方案做一下简单的梳理. 1. Oracle Rac解决方案. Oracle Rac主要通过两台Oracle服务器来组件集群,提高Or ...
- openWRT自学计划安排
目标:充分理解openwrt的框架构成,能够在openwrt框架下实现:开发新程序,修改现有程序,修改内核,修改boot.为此,制定如下计划: 一.如何在openwrt上做开发 1.编译出一个BRCM ...
- Harbor配置ldap
1.修改配置Harborp配置文件,共修改三处 1.1 auth_mode = ldap_auth 1.2 ldap_url = ldap://10.10.20.202 1.3 ldap_basedn ...
- 使用Percona监控插件监控MySQL
1.使用Percona监控插件监控MySQL yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/per ...
- 【ubantu】Ubuntu的一些常用命令
创建文件: touch a.txt 创建文件夹: mkdir NewFolder 删除文件: rm a.txt 删除文件夹: rmdir NewFolder 删除带有文件的文件夹: rm -rf Ne ...
- Java中的使用了未经检查或不安全的操作(类前加:@SuppressWarnings("unchecked"))
Java中的使用了未经检查或不安全的操作 如此解决就可以了 类前面加@SuppressWarnings("unchecked") @SuppressWarnings("u ...
- 3s 简介
"3S"技术是英文遥感技术(Remote Sensing RS).地理信息系统(Geographical information System GIS).全球定位系统(Global ...
- line-height:0的使用
在这里不介绍line-height的概念 建议看一下张鑫旭 写的line-height 文章 这里只说 用到的一些小地方 div中img有间隙的解决方案就是用到了这个小小的属性 那么请看方案 方案 ...
- python 基础 9.10 删除数据
#/usr/bin/python #-*- coding:utf-8 -*- #@Time :2017/11/24 4:40 #@Auther :liuzhenchuan #@File : ...
- 监控httpd的shell脚本
#!/bin/bash # Apache httpd进程监控shell # 如果你在使用RHEL / CentOS / Fedora Linux,使用这个重启命令 RESTART="/sbi ...