题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394

题意:给出一个循环数组,求其逆序对最少为多少;

思路:对于逆序对: 交换两个相邻数,逆序数 +1 或 -1, 交换两个不相邻数 a, b, 逆序数 += 两者间大于 a 的个数 - 两者间小于 a 的个数;

所以只要求出初始时的逆序对数,就可以推出其余情况时的逆序对数.对于求初始逆序对数,这里 n 只有 5e3,可以直接暴力 / 树状数组 / 线段树 / 归并排序;

代码:

1.直接暴力

 #include <iostream>
#include <stdio.h>
using namespace std; const int MAXN = 5e3 + ;
int a[MAXN]; int main(void){
int n, ans = ;
while(~scanf("%d", &n)){
ans = ;
for(int i = ; i < n; i++){
scanf("%d", &a[i]);
for(int j = ; j < i; j++){
if(a[j] > a[i]) ans++;
}
}
int cnt = ans;
for(int i = ; i < n; i++){
cnt += (n - a[i] - ) - a[i];
ans = min(ans, cnt);
}
printf("%d\n", ans);
}
return ;
}

2.树状数组

 #include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std; const int MAXN = 5e3 + ;
int tree[MAXN], a[MAXN], n; int lowbit(int x){
return x & (-x);
} void updata(int x, int d){
while(x <= n){
tree[x] += d;
x += lowbit(x);
}
} int sum(int x){
int ans = ;
while(x > ){
ans += tree[x];
x -= lowbit(x);
}
return ans;
} int main(void){
int ans = ;
while(~scanf("%d", &n)){
ans = ;
memset(tree, , sizeof(tree));
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
updata(a[i] + , );
ans += i - sum(a[i] + );//当前是第 i 个数,减去a[i]前面(这里包括了a[i])的数就是a[i]后面的数了,即可以和a[i]组成逆序对的数的数目
// ans += sum(n) - sum(a[i] + 1);
}
int cnt = ans;
for(int i = ; i <= n; i++){
cnt += (n - a[i] - ) - a[i];
ans = min(ans, cnt);
}
printf("%d\n", ans);
}
return ;
}

3.线段树

 #include <iostream>
#include <stdio.h>
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std; const int MAXN = 5e3 + ;
int sum[MAXN << ], a[MAXN]; void push_up(int rt){
sum[rt] = sum[rt << ] + sum[rt << | ];
} void build(int l, int r, int rt){
sum[rt] = ;
if(l == r) return;
int mid = (l + r) >> ;
build(lson);
build(rson);
} void update(int p, int x, int l, int r, int rt){
if(l == r){
sum[rt] += x;
return;
}
int mid = (l + r) >> ;
if(p <= mid) update(p, x, lson);
else update(p, x, rson);
push_up(rt);
} int query(int L, int R, int l, int r, int rt){
if(l >= L && r <= R) return sum[rt];
int mid = (l + r) >> ;
int ans = ;
if(L <= mid) ans += query(L, R, lson);
if(R > mid) ans += query(L, R, rson);
return ans;
} int main(void){
int n, ans = ;
while(~scanf("%d", &n)){
ans = ;
build(, n-, );
for(int i = ; i < n; i++){
scanf("%d", &a[i]);
ans += query(a[i], n - , , n - , );
update(a[i], , , n - , );
}
int cnt = ans;
for(int i = ; i < n; i++){
cnt += (n - a[i] - ) - a[i];
ans = min(ans, cnt);
}
printf("%d\n", ans);
}
return ;
}

hdu1394(枚举/树状数组/线段树单点更新&区间求和)的更多相关文章

  1. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  2. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  3. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  4. HDU 3303 Harmony Forever 前缀和+树状数组||线段树

    Problem Description We believe that every inhabitant of this universe eventually will find a way to ...

  5. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)

    学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...

  7. 树状数组 && 线段树

    树状数组 支持单点修改 #include <cstdio> using namespace std; int n, m; ], c[]; int lowbit(int x) { retur ...

  8. hdu1166 敌兵布阵 树状数组/线段树

    数列的单点修改.区间求和 树状数组或线段树入门题 #include<stdio.h> #include<string.h> ],N; void add(int x,int a) ...

  9. hdu 1166 敌兵布阵——(区间和)树状数组/线段树

    pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...

随机推荐

  1. Pentaho BIServer Community Edtion 6.1 使用教程 第四篇 安装和使用Saiku 插件 进行 OLAP

    OLAP(On-Line Analytical Processing,联机分析处理)是一个使分析师.管理者和执行者从原始数据中用来快速.一致.交互访问的一种软件技术,从而真实的反映企业的数据情况.OL ...

  2. FastJson处理Map List 对象

     Fastjson是一个Java语言编写的高性能功能完善的JSON库. Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发. 1.遵循http://json.org标准,为其官 ...

  3. (转)浅析三层架构与MVC模式的区别

    MVC模式介绍: MVC全名是Model ViewController,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据 ...

  4. python_learn1

    1.python在命令行获取当前的路径. import os os.getcwd() os.chdir(r"C:\Users\szlon\Desktop\pythonexer") ...

  5. 【linux】crontab的环境变量问题

    今天遇到一个奇怪的问题,同样一个脚本,手动执行没问题,加入到crontab中,就出现无法运行的情况,第一反应是环境变量问题 环境说明: 操作系统:centos 用户:test用户通过sudo su切换 ...

  6. CodeIgniter底层数据库类继承关系

    1.CI_DB_mysql_driver 继承 CI_DB,  CI_DB这个类是不存在的,每次调用文件中~/CodeIgniter_2.1.3/system/database/DB.php函数&am ...

  7. 算法(Algorithms)第4版 练习 1.3.9

    主要思路: 用Dijkstra的双栈算法. 遇到数字则压入数字栈中(String). 遇到运算符则压入运算符栈中(String). 遇到右括号时,从数字栈和运算法栈中弹出相应的元素,生成相应的运算表达 ...

  8. 尚学堂xml学习笔记

    1.打开eclipse,文件-新建java project,输入文件的名字,比如输入20181112. 2.对着src右键,选择new-file,输入文件名字,比如:book.xml. 3.开始写.x ...

  9. XML文件的特点

    1.这个东西的规则比较简单,并且人眼看起来也比较容易理解,结构上也比较好操作,并且并无与任何编程语言绑定. 所以,很多编程语言就都为XML这个东西编写了读写XML的库,所以XML看起来所谓的通用,其实 ...

  10. 练习E-R图书管理数据库