POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树
题目链接:http://poj.org/problem?id=2299
求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法。
归并排序:
#include<cstdio>
#include<iostream>
using namespace std;
#define max 500002
int arr[max],b[max];//b[]为临时序列,arr[]为待排序数列,结果在arr[]中
int tp[max];
long long cnt=;//总逆序数
void Merge(int a[],int start,int mid,int end){
int i =start,j=mid+,k=start;
while(i<=mid&&j<=end){
if(a[i]<=a[j]){
cnt+=j-mid-;
b[k++]=a[i++];
}else{
cnt+=j-k;
b[k++]=a[j++];
}
}
while(i<=mid){
cnt+=end-mid;
b[k++]=a[i++];
}
while(j<=end){
b[k++]=a[j++];
}
for(int i=start;i<=end;i++){
a[i]=b[i];
}
}
void MergeSort(int a[], int start,int end){
if(start<end){
int mid=(start+end)/;
MergeSort(a,start,mid);
MergeSort(a,mid+,end);
Merge(a,start,mid,end);
}
}
int main(){
int n;
while(~scanf("%d",&n)&&n){
for(int i=;i<n;i++){
scanf("%d",&arr[i]);
}
cnt=;
MergeSort(arr,,n-);
printf("%I64d\n",cnt/);
}
return ;
}
树状数组:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x&(-x))
using namespace std;
const int MAX = ;
struct data{
int id,val;
}num[MAX];
int n, C[MAX];
bool cmp(data a, data b){
return a.val>b.val;
}
void add(int i){
while(i<=n){
C[i]+=;
i+=lowbit(i);
}
}
long long sum(int i){
long long ans = ;
while(i>){
ans+=C[i];
i-=lowbit(i);
}
return ans;
} int main(){
while(scanf("%d",&n)&&n){
memset(C,,sizeof(C));
for(int i=;i<n;i++){
num[i].id=i+;
scanf("%d",&num[i].val);
}
sort(num,num+n,cmp);//离散化,将数组按降序排序,再求下标的逆序数,下标的逆序数与值逆序数相等
long long ans = ;
for(int i=;i<n;i++){
ans+=sum(num[i].id-);//求在i前面比第i个数大的数的个数
add(num[i].id);
}
printf("%I64d\n", ans);
}
return ;
}
线段树( 以HDU1394 Minimum Inversion Number为例):
#include<iostream>
#include<cstdio>
#include<cstdlib>#include<algorithm>
const int INF = 0x3F3F3F3F;
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define N 5008
int sum[N<<], a[N];
inline void pushUp(int rt){
sum[rt] = sum[rt << ] + sum[rt << | ];
} int query(int a, int b, int l, int r, int rt){
if(a <= l && b >= r){
return sum[rt];
}
int m=(l + r) >> ;
int ret=;
if(a <= m){
ret += query(a, b, lson);
}
if(b > m){
ret += query(a, b, rson);
}
return ret;
}
void update(int x, int val, int l, int r, int rt){
if(l == r){
sum[rt] = val;
}else{
int m = (l + r)/;
if(x <= m){
update(x, val, lson);
}else{
update(x, val, rson);
}
pushUp(rt);
}
} int main(){
int n;
while(~scanf("%d", &n)){
memset(sum, , sizeof(sum));
int ans = ;
for(int i = ; i < n; i++){
scanf("%d", &a[i]);
a[i]++;
ans += query(a[i] + , n, , n , );
update(a[i], , , n, );
}
int tp = ans;
for(int i = ; i < n - ; i++){
tp += n - * a[i] + ;
ans = min(ans , tp);
}
printf("%d\n",ans);
}
}
POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树的更多相关文章
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- POJ 1195 Mobile phones (二维树状数组或线段树)
偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...
- st表、树状数组与线段树 笔记与思路整理
已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- 【BZOJ3196】二逼平衡树(树状数组,线段树)
[BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
Jam's problem again Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
随机推荐
- gcc编译时对'xxxx'未定义的引用问题
gcc编译时对’xxxx’未定义的引用问题 gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没 ...
- $.extend() 或 jQuery.extend() 与 $.fn.Xxx 或 jQuery.fn.extend(object) 之jQuery插件开发
jQuery为开发插件提拱了两个方法 语法现象1:$.extend() 或 jQuery.extend() 或 jQuery.extend(object)//可以理解为为jQuery类添加类方法或静态 ...
- JavaScript——同源策略
概念:同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准.它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载. 这里的同源指的是: ...
- 使用jsvc启动tomcat
1.在/usr/local/apache-tomcat-7.0.68/bin中有commons-daemon-native.tar.gz 压缩包 2.解压commons-daemon-native. ...
- OPCServer Modbus使用和配置
一,安装KEPware.Enhanced.OPC.DDE.KEPServer.(PLC数据传送给KEPServer,开发的程序用OPCServer读KEPServer) 设置ip地址后面是指的plc站 ...
- 关于TortoiseSVN的一些知识
TortoiseSVN的一切命令都是相对于它自己来说的 1.Import,导入,指的是导入SVN的代码库,即Repository. 2.Export,导出,指的是将代码从Repository中导出到你 ...
- Struts2常用标签
Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的 ...
- BestCoder27 1001.Jump and Jump... (hdu 5162) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5162 题目意思:有 n 个 kid,每个 kid 有三个成绩 a, b, c.选最大的一个成绩作为这个 ...
- Memcache使用
//需要下载memcache 服务 然后 在命令里面 安装和启动服务 //引用 Memcached.ClientLibrary.dllpublic class MemcacheHelper { pub ...
- Android Volley入门到精通:使用Volley加载网络图片
在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...