hdu1394(Minimum Inversion Number)线段树
明知道是线段树,却写不出来,搞了半天,戳,没办法,最后还是得去看题解(有待于提高啊啊),想做道题还是难啊。
还是先贴题吧
HDU-1394 Minimum Inversion Number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8324 Accepted Submission(s): 5115
inversion number of a given number sequence a1, a2, ..., an is the
number of pairs (ai, aj) that satisfy i < j and ai > aj.
For
a given sequence of numbers a1, a2, ..., an, if we move the first m
>= 0 numbers to the end of the seqence, we will obtain another
sequence. There are totally n such sequences as the following:
a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
a2, a3, ..., an, a1 (where m = 1)
a3, a4, ..., an, a1, a2 (where m = 2)
...
an, a1, a2, ..., an-1 (where m = n-1)
You are asked to write a program to find the minimum inversion number out of the above sequences.
input consists of a number of test cases. Each case consists of two
lines: the first line contains a positive integer n (n <= 5000); the
next line contains a permutation of the n integers from 0 to n-1.
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iomanip>
#include <set>
#include <map>
#include <vector>
#include <queue>
#define N 5005
using namespace std;
int a[N];
int segtree[N << ];
void update(int ll, int rr, int l, int r, int p)
{
if (ll <= l && rr >= r)
{
segtree[p]++;
return;
}
int mid = (l + r) >> , pp = p << ;
if (mid >= rr)
update(ll, rr, l, mid, pp);
else
if (mid < ll)
update(ll, rr, mid + , r, pp + );
else
{
update(ll, mid, l, mid, pp);
update(mid + , rr, mid + , r, pp + );
}
segtree[p] = segtree[pp] + segtree[pp + ];
}
int query(int ll, int rr, int l, int r, int p)
{
if (ll <= l && rr >= r)
return segtree[p]++;
int mid = (l + r) >> , pp = p << ;
if (mid >= rr)
query(ll, rr, l, mid, pp);
else
if (mid < ll)
query(ll, rr, mid + , r, pp + );
else
return query(ll, mid, l, mid, pp) +
query(mid + , rr, mid + , r, pp + );
}
int main()
{
int n, i, ans, minans;
while (~scanf("%d", &n))
{
memset(segtree, , sizeof(segtree));
ans = ;
for (i = ; i <= n; i++)
{
scanf("%d", &a[i]);
update(a[i] + , a[i] + , , n, );//将所有数加1,除去0,线段树下标从1开始
if (a[i] + < n)//当a[i] = n,不操作
ans += query(a[i] + , n, , n, );
}
minans = ans;
for (i = ; i < n; i++)
{
ans += n - a[i] * -;
if (minans > ans)
minans = ans;
}
printf("%d\n", minans);
}
return ;
}
hdu1394(Minimum Inversion Number)线段树的更多相关文章
- HDU-1394 Minimum Inversion Number 线段树+逆序对
仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- [HDU] 1394 Minimum Inversion Number [线段树求逆序数]
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- HDU 1394 Minimum Inversion Number(线段树 或 树状数组)
题目大意:给出从 0 到 n-1 的整数序列,A0,A1,A2...An-1.可将该序列的前m( 0 <= m < n )个数移到后面去,组成其他的序列,例如当 m=2 时,得到序列 A2 ...
- hdu - 1394 Minimum Inversion Number(线段树水题)
http://acm.hdu.edu.cn/showproblem.php?pid=1394 很基础的线段树. 先查询在更新,如果后面的数比前面的数小肯定会查询到前面已经更新过的值,这时候返回的sum ...
- hdu 13394 Minimum Inversion Number 线段树
题意: 首先给你一个长度为n的序列v,你需要首先找出来逆序对(i<j && v[i]>v[j]) 然后把这个序列的最后一个元素放在第一个位置上,其他元素都向后移动一位. 一 ...
- HDU 1394 Minimum Inversion Number 线段树
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1394 没看到多组输入,WA了一万次...... 其实很简单,有人暴力过得,我感觉归并排序.二叉排序树求逆 ...
- HDU1394 Minimum Inversion Number(线段树OR归并排序)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 2018.07.08 hdu1394 Minimum Inversion Number(线段树)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
随机推荐
- 安装截图软件shutter
直接进入软件中心安装吧 不知道软件中心安装的软件可以apt upgrade 命令更新么 应该是可以的,感觉软件中心就是个图形化的apt和新立得差不多 shutter可以放大缩小截图, ctrl + 鼠 ...
- Qt文本读写之二:目录操作
一.简介 QDir类用来访问目录结构及其内容,可以操作路径名.访问路径和文件相关信息以及操作底层的文件系统,还可以访问Qt的资源系统.Qt使用"/"作为通用的目录分隔符和URLs的 ...
- WOJ1109 奶牛排队
题目链接: WOJ1109 题目描述: 奶牛在熊大妈的带领下排成了一条直队. 显然,不同的奶牛身高不一定相同-- 现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最 ...
- Two Flowers CodeChef - TWOFL
https://vjudge.net/problem/CodeChef-TWOFL 先把颜色相同的合并成一个点,建好图,枚举要取的两种颜色(根据图中所有边决定哪些组合要枚举)即可 错误记录: 1.写了 ...
- 转 google 制作 邀请函
http://blog.csdn.net/adali/article/details/8315619
- Package 和 import 语句
- C++ thread operator= 右值引用 vector foreach
这是 thread 的construct定义: default (1) thread() noexcept; initialization (2) template <class Fn, cla ...
- javascript回调函数那些事~
什么是回调函数? 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直 ...
- AJPFX关于表结构的相关语句
//表结构的相关语句==================================== 建表语句: create table 表名( ...
- Web前端攻防,一不小心就中招了
随着各浏览器安全功能的提高,前端防御面临的问题也没有之前那么复杂,但浏览器的防御措施并不能百分百的保证网站的安全. 浏览器的XSS Auditor,使得反射型xss几乎被废:CSP(Content-S ...