HDU 4911

http://acm.hdu.edu.cn/showproblem.php?pid=4911

一场多校的签到题,树状数组离散化求逆序数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
typedef __int64 ll ;
int n,k ;

int tree[100005],b[100005] ;
struct node
{
    int num,id ;
}a[100005] ;

int lowbit(int x){return x&(-x) ;}

void update(int i,int x)
{
    while(i<=n)
    {
        tree[i]+=x ;
        i+=lowbit(i) ;
    }
}

int sum(int i)
{
    int res=0 ;
    while(i>0)
    {
        res+=tree[i] ;
        i-=lowbit(i) ;
    }
    return res ;
}
int cmp(node aa,node bb)
{
    return aa.num<bb.num ;
}
int main()
{
    ll ans ;
    while(~scanf("%d%d",&n,&k))
    {
        for(int i=1 ;i<=n ;i++)
        {
            scanf("%d",&a[i].num) ;
            a[i].id=i ;
        }
        memset(tree,0,sizeof(tree)) ;
        memset(b,0,sizeof(tree)) ;
        sort(a+1,a+n+1,cmp) ;
        b[a[1].id]=1 ;
        for(int i=2 ;i<=n ;i++)
        {
            if(a[i].num==a[i-1].num)b[a[i].id]=b[a[i-1].id] ;
            else b[a[i].id]=i ;
        }
        ans=0 ;
        for(int i=1 ;i<=n ;i++)
        {
            update(b[i],1) ;
            ans+=sum(n)-sum(b[i]) ;
        }
        printf("%I64d\n",ans-k>0?ans-k:0) ;
    }
    return 0 ;
}

时间: 2024-11-04 19:53:14

HDU 4911的相关文章

HDU 4911 Inversion 求逆序数对

点击打开链接 Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1106    Accepted Submission(s): 474 Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent num

2014多校联合五(HDU 4911 HDU 4915 HDU 4920)

HDU 4911 Inversion 题意:n个数字  通过k次相邻交换  使得逆序对数最少 思路:如果序列为 XXXABYYY  假设A和B位置互换  易知X和AB.Y和AB的逆序对数不变  换句话说一次交换最多使逆序对减少1  那么只需要求原逆序对数和k进行比较即可 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100100 type

hdu 4911 Inversion

Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 197    Accepted Submission(s): 82 Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent numbers for

HDU 4911 Inversion(归并求逆序对)

HDU 4911 Inversion 题目链接 题意:给定一个数组,可以相邻交换最多k次,问交换后,逆序对为多少 思路:先利用归并排序求出逆序对,然后再减去k就是答案 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 100005; int n, num[N], save[N], sn; void init() { for

hdu 4911 Inversion(归并)

题目链接:hdu 4911 Inversion 题目大意:给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 解题思路:每交换一次一定可以减少一个逆序对,所以问题转换成如何求逆序对数. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 1e5+5; ll k

2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)

题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后来终于想出来这根本就是求逆序数嘛,可以用归并排序,也可以用树状数组,不过我们用树状数组做错了,也不知道为什么.求出逆序数来再减掉k次,就可以求出最终结果来了.求逆序数链接1,链接2 1 #include <stdio.h> 2 3 int left[250003], right[250003];

hdu 4911 Inversion(归并排序求逆序对数)

Inversion                                                                             Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two 

hdu 4911 Inversion(求逆序数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 528    Accepted Submission(s): 228 Problem Description bobo has a sequence a1,a2,

HDU 4911 Inversion(归并排序求逆序数)

归并排序求逆序数,然后ans-k与0取一个最大值就可以了. 也可以用树状数组做,比赛的时候可能姿势不对,树状数组wa了.. Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 578    Accepted Submission(s): 249 Problem Description bobo has a seque

归并排序求逆序数(POJ 1804,POJ 2299,HDU 4911)

首先,明确两个概念: 逆序对:数列a[1],a[2],a[3]-中的任意两个数a[i],a[j] (i<j),如果a[i]>a[j],那么我们就说这两个数构成了一个逆序对. 逆序数:一个数列中逆序对的总数. 例题一:POJ 1804.   点击打开链接 解题思路:每次交换只能减少一个逆序,而且必定能减少一个逆序,从而问题就转换为求逆序个数了.这题数据规模很小,暴力可过. 我这里提供了用Merge_sort的方法求解逆序数,时间复杂度为O(nlogn). 关于归并排序:归并排序是将数列a[l,h