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 ...
随机推荐
- 17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- Navicat for MySQL的使用
一. 在Navicat for MySQL软件中,如何打开MySQL命令行界面: 图 (1) 如何调出MySQL命令行界面 如图(1)所示,在左侧空白处,右键单击即可调出“命令列介面” 注意,输入My ...
- Routing in ASP.NET Web API和配置文件的设定读取
Routing Tables In ASP.NET Web API, a controller is a class that handles HTTP requests. The public me ...
- 【leetcode】Spiral Matrix II
Spiral Matrix II Given an integer n, generate a square matrix filled with elements from 1 to n2 in s ...
- poj 1562
这道题主要注意输入的问题,以及对周围搜索时的注意,要使用递归,多次调用,附上一组数据 11 20*@*@*@@@**@*@**@@@*****@*@*@*@*@****@**@*@*@*@*@*@*@ ...
- ios 关于使用异步网络请求时block回调的内存注意
在一个controller中,使用 NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest ...
- iOS 在UITableViewCell中加入自定义view时view的frame设定注意
由于需要重用同一个布局,于是在cellForRowAtIndexPath中把自定义view加在了cell上,我是这样设定view的frame的 var screenFrame = UIScreen.m ...
- 7.js模式-装饰者模式
1. 装饰者模式 给对象动态增加职责的方式称为装饰者模式. Function.prototype.before = function(beforefn){ var _self = this; retu ...
- python2.79安装
从官网下载最新的安装程序,基于windows的,也可以直接百度下载 点击安装,如果其他用户不需要python的话,可以使用第二个,不过我们一般都是单用户,所以没差 选择安装路径,可按默认路径安装,也可 ...
- SQL如何本地数据库连接服务器的数据库
当我们本地数据库的数据作为测试的时候,需要服务器上的数据,但是每次都远程服务器打开数据库查看数据是很麻烦的,那么我们如何让本地的数据库连接服务器上的数据库.前提是你本地的数据库的版本必须和服务器上的数 ...