码迷,mamicode.com
首页 > 其他好文 > 详细

Time Limit Exceeded 求逆序对数。

时间:2017-04-12 03:50:37      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:void   ==   index   多少   http   scanf   个数   sizeof   limit   

/**
题目:Time Limit Exceeded
链接:https://oj.ejq.me/problem/28
题意:求逆序对数。
思路:树状数组求逆序对数。维护前面有多少个<=当前数的数的个数。
*/
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn = 1e6+10;
const int mod = 1e9+7;
ll c[maxn];
int flag[maxn];
int n;
int a[maxn];
int lowbit(int t)
{
    return t&(-t);
}
ll getSum(int pos)
{
    ll sum = 0;
    while(pos>0){
        sum += c[pos];
        pos -= lowbit(pos);
    }
    return sum;
}
void update(int pos,int add)
{
    while(pos<=n){
        c[pos]+=add;
        pos += lowbit(pos);
    }
}
int main()
{
    while(scanf("%d",&n)==1)
    {
        memset(flag, 0, sizeof flag);
        for(int i = 1; i <= n; i++){
            scanf("%d",&a[i]);
            flag[a[i]] = 1;
        }
        int index = 1;///树状数组从1开始。
        for(int i = 0; i <= 1000000; i++){
            if(flag[i]){
                flag[i] = index++;
            }
        }
        memset(c, 0, sizeof c);
        ll ans = 0;
        for(int i = 1; i <= n; i++){
            ans += i-1-getSum(flag[a[i]]);
            update(flag[a[i]],1);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

Time Limit Exceeded 求逆序对数。

标签:void   ==   index   多少   http   scanf   个数   sizeof   limit   

原文地址:http://www.cnblogs.com/xiaochaoqun/p/6696503.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!