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]. ...
随机推荐
- lua学习笔记(十一)
面向对象编程 对象的实现 在lua中table就是一种对象 1.有自己的状态 2.有自己的唯一标识self 3.有自己的生命周期 ...
- PHP插入法排序
/** 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法. 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描, 找到相应位置并插入.插入排序在实现上 ...
- lua(简单的传参)
#include <iostream> #include <string.h> extern "C" { /*头文件lua.h定义了Lua提供的基础函数,包 ...
- 【BZOJ3991】[SDOI2015]寻宝游戏 树链的并+set
[BZOJ3991][SDOI2015]寻宝游戏 Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩 ...
- Labview新建项目步骤
打开Labview软件,点击工具栏中文件选项卡,如图所示. 2 点击新建一个空白项目. 3 此时为未命名项目,按下Ctrl+S保存项目到自己指定的目录并完成命名. 4 如图示在我的电脑上点击右键,新建 ...
- Struts中类型转换踩的坑
出现的异常: 当我输入的数据很大时候,转换后如上,这并不是我想要的, 出现问题的原因: Struts2对常用的数据类型如String.Integer.Double等都添加了转换器进行对应的转换操作. ...
- Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks
Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks S. Chen, C. F. N. Cow ...
- Module 'curl' already loaded in Unknown on line 0
Module 'curl' already loaded in Unknown on line 0 应该是php binary已经包含curl,你又动态加载了一遍.屏蔽掉你的extension 引用, ...
- Intel Quick Sync Video Encoder
本篇记录Intel E3 1275处理器集成显卡的硬编码预研过程. 步骤如下: (1)环境搭建 (2)demo编译,测试 (3)研究demo源码,Media SDK API使用 (4)编写so动态库封 ...
- Python socket TCPServer Demo
#coding:utf-8 from SocketServer import TCPServer,BaseRequestHandler import traceback class MyBaseReq ...