hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接: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(枚举/树状数组/线段树单点更新&区间求和)的更多相关文章
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- HDU 3303 Harmony Forever 前缀和+树状数组||线段树
Problem Description We believe that every inhabitant of this universe eventually will find a way to ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)
学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...
- 树状数组 && 线段树
树状数组 支持单点修改 #include <cstdio> using namespace std; int n, m; ], c[]; int lowbit(int x) { retur ...
- hdu1166 敌兵布阵 树状数组/线段树
数列的单点修改.区间求和 树状数组或线段树入门题 #include<stdio.h> #include<string.h> ],N; void add(int x,int a) ...
- hdu 1166 敌兵布阵——(区间和)树状数组/线段树
pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...
随机推荐
- SAP流水号
[转]编号范围对象维护 Tcode: SNRO OYSM 1.Number Range的通用Tcode:SNRO 2.Number Range的通用读取函数:NUMBER_GET_NEXT 3 ...
- 04-树7 二叉搜索树的操作集(30 point(s)) 【Tree】
04-树7 二叉搜索树的操作集(30 point(s)) 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType ...
- vi编辑器使用方法(最详细)
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- Sturs2 -概念讲解 第一弹
源码下载地址:http://struts.apache.org/ struts-2.5.14.1-all.zip --所有内容 struts-2.5.14.1-apps.zip --实例的应用 st ...
- html5--1.11列表
html5--1.11列表 学习要点: 无序列表 有序列表 列表的属性 自定义列表 1.无序列表的基本格式 ul(unorder line)标签里面放li标签就好了,每一项就是一个li(LineIte ...
- 机器学习(九)—逻辑回归与SVM区别
逻辑回归详细推导:http://lib.csdn.net/article/machinelearning/35119 面试常见问题:https://www.cnblogs.com/ModifyRong ...
- Linux_服务器_04_vim编辑器的使用
二.参考文档 1.linux系统中如何进入退出vim编辑器,方法及区别
- codeforces 706D D. Vasiliy's Multiset(trie树)
题目链接: D. Vasiliy's Multiset time limit per test 4 seconds memory limit per test 256 megabytes input ...
- docker镜像管理基础
[root@node01 ~]# docker pull quay.io/coreos/flannel:v0.10.0-amd64 v0.10.0-amd64: Pulling from coreos ...
- transition插件
$("#box").transition({ opacity: 0.1, scale: 0.3 }); $("#box").transition({ opaci ...