1. 首页
  2. 线段树

UVALive 7429 Guessing Camels (求逆序数对)

题意:~

思路:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
typedef pair<int, int> PI;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int MAXN = 200010;

int sum[MAXN << 2];
int a[MAXN], b[MAXN], c[MAXN], id[MAXN];
int n;

inline void pushup(int rt)
{
    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}

void build(int l, int r, int rt)
{
    if(l == r)
    {
        sum[rt] = 0;
        return;
    }
    int m = (l + r) >> 1;
    build(lson);
    build(rson);
    pushup(rt);
}

void modify(int p,int x, int l, int r, int rt)
{
    if(l == r)
    {
        sum[rt] ++;
        return;
    }
    int m = (l + r) >> 1;
    if(p <= m) modify(p, x, lson);
    else modify(p, x, rson);
    pushup(rt);
}

int query(int L, int R, int l, int r, int rt)
{
    if(L <= l && r <= R) return sum[rt];
    int m = (l + r) >> 1;
    int res = 0;
    if(L <= m) res += query(L, R, lson);
    if(R > m) res += query(L, R, rson);
    return res;
}

LL solve(int x[], int y[])
{
    for(int i = 0; i < n; ++i) id[x[i]] = i;
    build(0, n - 1, 1);
    LL ans = 0;
    for(int i = 0; i < n; ++i)
    {
        ans += query(id[y[i]], n - 1, 0, n - 1, 1);
        modify(id[y[i]], 1, 0, n - 1, 1);
    }
    return ans;
}


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(cin >> n)
    {
        for(int i = 0; i < n; ++i) cin >> a[i];
        for(int i = 0; i < n; ++i) cin >> b[i];
        for(int i = 0; i < n; ++i) cin >> c[i];
        LL ans = solve(a, b) + solve(b, c) + solve(c, a);
        ans = (LL)n * (n - 1) / 2 - ans / 2;
        cout << ans << endl;
    }
    return 0;
}

 

评分 0, 满分 5 星
0
0
看完收藏一下,下次也能找得到
  • 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
  • 文章链接:http://www.carlstedt.cn/archives/1420 (转载时请注明本文出处及文章链接)
  • 本文无相关文章
上一篇:
:下一篇

发表评论

gravatar

快来吐槽一下吧!

  1. .01 4:06
  2. .02 1:47
  3. .03 3:39
  4. .04 1:40