`

hdu 3743 Frosh Week(离散化+树状数组)

阅读更多

Frosh Week

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 289    Accepted Submission(s): 72

Problem Description
During Frosh Week, students play various fun games to get to know each other and compete against other teams. In one such game, all the frosh on a team stand in a line, and are then asked to arrange themselves according to some criterion, such as their height, their birth date, or their student number. This rearrangement of the line must be accomplished only by successively swapping pairs of consecutive students. The team that finishes fastest wins. Thus, in order to win, you would like to minimize the number of swaps required.

 

Input
The first line of input contains one positive integer n, the number of students on the team, which will be no more than one million. The following n lines each contain one integer, the student number of each student on the team. No student number will appear more than once.

 

Output
Output a line containing the minimum number of swaps required to arrange the students in increasing order by student number.

 

Sample Input
3 3 1 2

 

Sample Output
2

 

         此题大意:与上题一样,求逆序数,不要给英文骗到。我想练下写离散化,所以再写一次,印象更深刻。

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743

代码:

#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <algorithm>
using namespace std;

int n, a[1000005];

struct node
{
    int num, id;
}ch[1000005];

bool cmp1(node a, node b)
{
    return a.num < b.num;
}

bool cmp2(node a, node b)
{
    return a.id < b.id;
}

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

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

int sum(int i)
{
    int sum = 0;
    while(i > 0)
    {
        sum += a[i];
        i -= lowbit(i);
    }
    return sum;
}

int main()
{
    int i;
    long long ans;  //注意要long long!!!
    while(scanf("%d", &n) != EOF)
    {
        ans = 0;
        memset(a, 0, sizeof(a));
        for(i = 1; i <= n; i++)
        {
            scanf("%d", &ch[i].num);
            ch[i].id = i;
        }
        ///离散化
        sort(ch+1, ch+n+1, cmp1);   //按值排序
        ch[1].num = 1;      //直接把他的值改变离散化
        for(i = 2; i <= n; i++)
        {
            if(ch[i].num != ch[i-1].num)
                ch[i].num = i;
            else ch[i].num = ch[i-1].num;
        }
        sort(ch+1, ch+n+1, cmp2);   //再按id排序
        ///离散化完毕
        for(i = 1; i <= n; i++)
        {
            update(ch[i].num, 1);
            ans += (sum(n) - sum(ch[i].num));
        }
        printf("%I64d\n", ans);
    }

    return 0;
}

 

 

 

 

0
5
分享到:
评论

相关推荐

    hdu 1695 GCD(欧拉函数+容斥原理).docx

    "hdu 1695 GCD(欧拉函数+容斥原理)" 题目大意是:给定 a, b, c, d, k,找到一队 x, y,满足 g(x, y) = k,且 x ∈ [1, b], y ∈ [1, d],问有多少对符合要求的 (x, y)。 思路是:gcd(x, y) == k 解释 x, y 都能...

    HDU ACM as easy as a+b

    - **变量声明与初始化**:例如 `int n, m, j, i, k, l;` 和 `long int a[1000];` 分别声明了多个整型变量和一个长度为1000的长整型数组。 - **循环结构**:使用 `for` 循环来实现重复操作,例如 `for(k=0;k;k++)` 和...

    树状数组(Binary Indexed Tree)

    **树状数组**(Binary Indexed Tree, BIT),又称**费尼克树**(Fenwick Tree),是一种特殊的数据结构,它能高效地完成对数组元素的累加查询和更新操作。相较于其他数据结构如线段树,树状数组在实现上更为简洁,...

    HDU+2000-2099+解题报告

    6. **数据结构**:堆(大顶堆、小顶堆)、平衡二叉搜索树(AVL、红黑树)、树状数组、 Fenwick Tree(二分索引树)等。 7. **组合数学**:排列组合、鸽巢原理、容斥原理、卡特兰数、斯特林数等。 8. **概率统计**...

    HDU+2000-2099+解题报告.zip

    《杭电OnlineJudge 2000-2099解题报告》是针对杭州电子科技大学(HDU)在线评测系统(OnlineJudge)中2000至2099题目的详细解答集锦,主要涵盖了算法分析、编程技巧以及问题解决策略等内容。这份解题报告以CHM...

    hdu 3341(ac自动机+状态压缩)

    hdu 3341(ac自动机+状态压缩) 题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A、T、C、G其中...

    ACM hdu 线段树题目+源代码

    线段树是一种树形结构,它将一个数组分割成多个小 区间,每个区间对应树上的一个节点。线段树的每个节点都包含了该节点对应的区间信息。 线段树的主要应用 线段树的主要应用是解决区间问题,例如区间和、区间...

    【HDU 3993】田忌赛马 题解+勘误

    【田忌赛马】是一道源自古代中国历史的著名策略问题,被转化为计算机科学中的算法题目,出现在HDU(杭州电子科技大学在线评测系统)的3993号问题中。该题目的主要目的是通过编程来解决如何在不确定的对手策略下,...

    HDU刷题地图+精选详细笔记

    本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!

    hdu1250高精度加法

    ### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...

    hdu.rar_hdu

    3. **数据结构**:数组、链表、栈、队列、树(二叉树、平衡树如AVL和红黑树)、图(邻接矩阵、邻接表、最小生成树、拓扑排序等)。 4. **字符串处理**:KMP算法、Manacher's Algorithm、Rabin-Karp算法等。 5. **...

    hdu 300+ AC 代码

    线段树在处理动态区间问题时非常有效,如在数组上进行区间加法、区间求和等操作。理解和熟练运用线段树是解决复杂数据结构题目的关键。 3. **字符串处理**:字符串是编程中常见的数据类型,用于处理文本信息。字符...

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...

    hdu动态规划算法集锦

    根据提供的信息,我们可以总结出以下关于“hdu动态规划算法集锦”的知识点: ### 动态规划基础概念 动态规划是一种解决多阶段决策问题的方法,它通过将原问题分解为互相重叠的子问题,利用子问题的解来构建原问题...

    hdu 的2072,2084,2082,1170,ac代码

    HDU 2084题要求我们对数组进行操作,这通常与矩阵处理相关。代码实现的过程中,首先读取矩阵的大小和矩阵本身的数据,然后进行特定的矩阵压缩操作。这类问题不仅考验了我们对二维数组的控制能力,还要求我们理解并...

    解题代码 hdu1241

    DFS是一种用于遍历或搜索树或图的算法。在这个过程中,算法从根节点开始探索尽可能深的子节点路径。当到达最深的叶子节点时,它会回溯到最近的一个未完成探索的节点,并继续进行探索。 **实现方法:** DFS通常有两...

Global site tag (gtag.js) - Google Analytics