zoukankan      html  css  js  c++  java
  • day1 火柴排队

    noip2013的第二题,就思路上来讲,两数组输入数据后予以排序(利用自带的c++中sort就好O(∩_∩)O~),然后找找逆序对的个数就好了,原理运用到了数学中的排序不等式:设有两组数a1,a2,……an,b1,b2,……bn,满足a1≤a2≤……≤an,b1≤b2≤……≤bn,则有a1bn+a2bn-1+……+anb1≤a1bt+a2bt+……+anbt≤a1b1+a2b2+anbn式中,t1,t2,……,tn是1,2,……,n的任意一个排列,当且仅当a1=a2=……=an或b1=b2=……=bn时成立。一般为了便于记忆,常记为:反序和≤乱序和≤同序和(取自百度百科)。下面贴出代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define lowbit(x) (((~(x))+1)&x)
    struct data{
    int order,bh;
    };
    data a[100005];
    data b[100005];
    int maxx=99999997;
    bool cmp(data x,data y)
    {
    return x.order<y.order;
    }
    int n,r[100005], ans=0;
    int t[100008];
    void add(int x)
    {
    for(int i=x;i<=n;i+=lowbit(i))
    t[i]++;
    }
    int sum(int x)
    {
    int rec=0;
    for (;x;x-=lowbit(x))
    rec+=t[x];
    return rec;
    }
    int main()
    {
    freopen("match.in","r",stdin);
    freopen("match.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i].order),a[i].bh=i;
    for (int i=1;i<=n;i++) scanf("%d",&b[i].order),b[i].bh=i;
    sort(a+1,a+n+1,cmp);sort(b+1,b+n+1,cmp);
    for(int i=1;i<=n;i++)
    r[a[i].bh]=b[i].bh;
    for(int i=n;i>=1;i--)
    {
    ans+=sum(r[i]);
    add(r[i]);
    ans%=maxx;
    }
    cout<<ans;
    return 0;
    }

    清清正正射命丸文是也~

  • 相关阅读:
    LeetCode Medium:15. 3Sum
    LeetCode Medium:12. Integer to Roman
    LeetCode Medium: 11. Container With Most Water
    TypeError: unsupported operand type(s) for /: 'map' and 'int'
    【C#】课堂知识点#4
    【C#】课堂知识点#3
    【统计与建模】R语言基本操作
    【题解】表达式的值
    【题解】瑞士轮
    【题解】道路游戏
  • 原文地址:https://www.cnblogs.com/Ayateriteri/p/5661664.html
Copyright © 2011-2022 走看看