cf 204 div2 D. Jeff and Furik 逆序对

     又一次看错题意……题目是两个人,一个人自己主观选择,一个人抛硬币,因为算期望,所以抛硬币那人可以无视掉,求出逆序对个数m,m为奇答案是2m-1,否则2m

    太囧

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
int org[100000];
int c[100000];
int ans=0;
void out(int *a,int n)
{
   for(int i=0;i<n;i++)
      printf("%d ",a[i]);
   puts("");
}
int meg(int l,int mid,int r)
{
    int i=l,j=mid+1,k=0;
    while(i<=mid)
    {
       while(j<=r&&org[i]>org[j])
          c[k++]=org[j++];
       ans+=j-mid-1;
       c[k++]=org[i++];
    }
    while(j<=r)c[k++]=org[j++];
    k=0;
    while(l<=r)org[l++]=c[k++];
}
void count(int l,int r)
{
    if(l<r)
    {
       int mid=(l+r)>>1;
       count(l,mid);
       count(mid+1,r);
       meg(l,mid,r);
    }
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
       ans=0;
        int i;
        for(i=0;i<n;i++)
           scanf("%d",&org[i]);
        count(0,n-1);
        double t;
        if(ans%2==0)ans*=2;
        else ans=ans*2-1;
        printf("%.6f\n",(double)(ans));
    }
}
时间: 2025-01-20 12:49:16

cf 204 div2 D. Jeff and Furik 逆序对的相关文章

cf 204 div2 C Jeff and Rounding 模拟

    智商题,如果没有0就很简单,一半加一半减,恒定的,和选择无关.有0的话就可以选择和某些配对,于是就可以更改加减次数.而枚举加减次数即可,比赛时就没想清楚这一点.具体见代码 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio>

如何实现数组中的逆序对

题目: 在数组中的两个数字如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对. 输入一个数组, 求出这个数组中的逆序对的总数. 使用归并排序的方法, 辅助空间一个排序的数组, 依次比较前面较大的数字, 算出整体的逆序对数, 不用逐个比较. 时间复杂度: O(nlogn) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h>

关于数组中的逆序对

题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数.其中1 <= n <= 10^5. 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出一个整数,表示数组中的逆序对的总数. 样例输入: 4 7 5 6 4 样例输出: 5 思路:最简单的方法是顺序数组,将每个数字与后面的比较,统计逆序对的个数,这种方法的时间

(算法导论习题解problem2.4)寻找一个序列中逆序对的数量

一个序列的逆序对是这样的两个元素, 对于序列A而言, i>j且A[i]<A[j], 于是A[i]和A[j]就形成一个逆序对. 研究一个序列中逆序对的数量是有实际意义的, 对于插入排序而言, 它排序的时间与待排序序列的逆序对数量成正比. 下面给出求出一个序列中逆序对数量的算法,类似于归并排序中使用的分治算法:一个序列的逆序对数量为它的左半部分逆序对的数量,加上右半部分逆序对的数量, 最后在合并的时候左半部分元素大于右半部分元素的数量.这几乎和归并算法的过程一模一样,只是在归并的时候加入了计数的操

剑指offer系列之三十四:数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 要找到数组中的逆序对,一种思路是每遍历到一个元素的时候就和后面的元素进行一一比较,这种算法的时间复杂度是O(n2),所以不是很理想.我们可以借鉴归并排序的思想,把数组划分为子数组,然后对每个子数组中的逆序对数进行统计,统计完成后再并到一个新的数组中进行统计,这样就化整为零,实现了高效统计.总计起来思路就是:首先把数组划分为子数组,然后统计子数组中的逆序对数,然后

C++求逆序对的方法_C 语言

本文实例讲述了C++求逆序对的方法,分享给大家供大家参考之用.具体实现方法如下: #include <iostream> #include <vector> using namespace std; int array[] = {3, 9, 7, 4, 5, 2}; const int size = sizeof array / sizeof *array; int temp[size]; //int numbers[size]; int reversePair(int *numb

cf 167.div2 D.Dima and Two Sequences

    今天的cf完全不在状态,A题10分钟才读懂题意.目测要掉rating了     这题题意很简单,就是按X升序排列会有多少种情况,一个排列组合的问题     设相同x的元素个数为Xi  ,完全相同为2K(易知若完全相同有且仅有2个,比赛的时候就没想到这一点)     ans= ∑Xi!/2^k    之所以能在阶乘中除2^k,是因为k最大为n/2,而n!中的2的因子至少为n/2 /* author:jxy lang:C/C++ university:China,Xidian Univers

CF 203 div2 E. Wrong Floyd 图论

    题目中只选取k个点更新,因此只要保证有一个点只连到非k点即可     注意:题目要求连通图!!比赛的时候没看到,WA了,只要改下输出顺序即可保证联通. /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include

cf 154.div2 D. Table with Letters - 2

D. Table with Letters - 2         今天的比赛题比较奸诈,居然是文件读入的,让A题耽误了很多时间.           这题是dp的一个经典类型,o((n*m)^2)的算法非常好写,但是必然TLE.因为其要求四角均相等,不妨以此为条件进行判断,即可缩为o(n^2*m)算法   /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please ind