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 }
  • 相关阅读:
    安全相关小知识
    http小知识
    跨域资源共享 CORS
    Django——CRSF攻击及处理
    Django——XSS攻击及处理
    Django——模版层(前后端交互编码方式,django模板使用的两种方式,模板语法之变量&深度查询句点符,模板渲染成标签还是原字符串,过滤器+自定义,标签+自定义)
    Django——Postman介绍及安装, 测试项目
    Django——视图层(请求&响应对象,cbv和fbv,文件上传)
    一个http请求从浏览器发出去,经历的过程(即上网流程)
    Django——有名分组 无名分组,反向解析,名称空间
  • 原文地址:https://www.cnblogs.com/Var123/p/5339424.html
Copyright © 2011-2022 走看看