zoukankan      html  css  js  c++  java
  • Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

    题目:http://codevs.cn/problem/3286/

    3286 火柴排队 

     

    2013年NOIP全国联赛提高组

     时间限制: 1 s 
     空间限制: 128000 KB 
     题目等级 : 钻石 Diamond
     
     
     
    题目描述 Description

    涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:
    ,其中 ai表示第一列火柴中第 i 个火柴的高度,bi表示第二列火柴中第 i 个火柴的高度。
    每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。

    输入描述 Input Description

    共三行,第一行包含一个整数 n,表示每盒中火柴的数目。
    第二行有 n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。
    第三行有 n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

    输出描述 Output Description

    输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果。

    样例输入 Sample Input

    [Sample 1]

    2 3 1 4 
    3 2 1 4
    [Sample 2]

    1 3 4 2 
    1 7 2 4

    样例输出 Sample Output

    [Sample 1]
    1
    [Sample 2]
    2

    数据范围及提示 Data Size & Hint

    【样例1说明】
    最小距离是 0,最少需要交换 1 次,比如:交换第 1 列的前 2 根火柴或者交换第 2 列的前 2 根火柴。
    【样例2说明】
    最小距离是 10,最少需要交换 2 次,比如:交换第 1 列的中间 2 根火柴的位置,再交换第 2 列中后 2 根火柴的位置。
    【数据范围】
    对于 10%的数据, 1 ≤ n ≤ 10; 
    对于 30%的数据,1 ≤ n ≤ 100; 
    对于 60%的数据,1 ≤ n ≤ 1,000; 
    对于 100%的数据,1 ≤ n ≤ 100,000,0 ≤火柴高度≤ 2^31 - 1。

    题解:

    树状数组+逆序对

    和 bzoj2789 几乎一样,还比那道简单。。。

    排序完,直接求逆序对的个数。。。

    当年爆零了。。。smg。。。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define MOD 99999997
     4 #define LL long long
     5 #define MAXN 100010
     6 struct node
     7 {
     8     int v,w;
     9 }a[MAXN],b[MAXN];
    10 int BIT[MAXN],c[MAXN],n;
    11 int read()
    12 {
    13     int s=0,fh=1;char ch=getchar();
    14     while(ch<'0'||ch>'9'){if(ch=='-')fh=1;ch=getchar();}
    15     while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
    16     return s*fh;
    17 }
    18 bool cmp(node aa,node bb)
    19 {
    20     return aa.v<bb.v;
    21 }
    22 int Lowbit(int o){return o&(-o);}
    23 void Update(int o,int o1)
    24 {
    25     while(o<=n)
    26     {
    27         BIT[o]+=o1;
    28         o+=Lowbit(o);
    29     }
    30 }
    31 LL Sum(int o)
    32 {
    33     LL sum=0;
    34     while(o>0)
    35     {
    36         sum+=(LL)BIT[o];
    37         o-=Lowbit(o);
    38     }
    39     return sum;
    40 }
    41 int main()
    42 {
    43     int i;
    44     LL ans;
    45     n=read();
    46     for(i=1;i<=n;i++)a[i].v=read(),a[i].w=i;
    47     for(i=1;i<=n;i++)b[i].v=read(),b[i].w=i;
    48     sort(a+1,a+n+1,cmp);
    49     sort(b+1,b+n+1,cmp);
    50     for(i=1;i<=n;i++)c[a[i].w]=b[i].w;
    51     memset(BIT,0,sizeof(BIT));
    52     ans=0;
    53     for(i=n;i>=1;i--)
    54     {
    55         ans=(ans+(LL)Sum(c[i]-1))%MOD;
    56         Update(c[i],1);
    57     }
    58     printf("%lld",ans);
    59     fclose(stdin);
    60     fclose(stdout);
    61     return 0;
    62 }
  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/Var123/p/5339424.html
Copyright © 2011-2022 走看看