洛谷 P5149 会议座位

洛谷 P5149 会议座位

Description

  • 现在校长在校园网上公布了一份座位表,n位老师从左到右依次排成一行。老师们都对这个座位很满意。

    然而到了开会时,校长不小心把座位表打乱了,老师们很不满。老师们并不在意自己的位置变了多少,但如果有一对老师a和b,他们原来的座位是a在b左边,现在变成了a在b右边,那么这一对老师便会贡献一单位不满值。

    校长想知道这些老师的总不满值是多少。

Input

  • 第一行一个正整数n,为n位老师。

    第二行有n个字符串,每个字符串代表老师的名字(大小写敏感)。这一行代表原来的座位表。

    第三行有n个字符串,代表打乱后的座位表。

Output

  • 老师们的总不满值。

Sample Input

5
A B C D E
B A D E C

Sample Output

3

Data Size

  • 30%的数据,n≤1000;

    100%的数据,n≤100000,每位老师名字长度不超过5,只有大小写字母并且互不相同。注意名字对大小写敏感。

题解:

  • 逆序对。
  • 刷水题机房划水
  • 用树状数组求的。
#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#define int long long
#define N 100005
#define lowbit(x) (x & (-x))
using namespace std;

int n, ans;
int a[N], t[N];
map<string, int> mp;

void upd(int pos, int val)
{
    while(pos <= n)
    {
        t[pos] += val;
        pos += lowbit(pos);
    }
}

int ask(int pos)
{
    int res = 0;
    while(pos >= 1)
    {
        res += t[pos];
        pos -= lowbit(pos);
    }
    return res;
}

signed main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        string t; cin >> t;
        mp[t] = i;
    }
    for(int i = 1; i <= n; i++)
    {
        string t; cin >> t;
        a[i] = mp[t];
    }
    for(int i = 1; i <= n; i++)
    {
        upd(a[i], 1);
        ans += i - ask(a[i]);
    }
    cout << ans;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/BigYellowDog/p/11620740.html
今日推荐