题目
分析
- 这道题乍一看,哦不就是个逆序对吗
- 用个map搞一下
- 直接打
代码
1 #include<iostream>
2 #include<map>
3 #include<cstdio>
4 #define ll long long
5 using namespace std;
6 map<string,int> mapp;
7 ll a[100001];
8 ll c[100001];
9 int n;
10 int lowbit(int x){ return x&(-x); }
11 void add(int i,int x)
12 {
13 while (i<=n)
14 {
15 c[i]+=x;
16 i+=lowbit(i);
17 }
18 }
19 int sum(int i)
20 {
21 int res=0;
22 while(i>=1)
23 {
24 res+=c[i];
25 i-=lowbit(i);
26 }
27 return res;
28 }
29 int main ()
30 {
31 string s;
32
33 cin>>n;
34 for (int i=1;i<=n;i++) {cin>>s; mapp[s]=i;}
35 for (int i=1;i<=n;i++) {cin>>s; a[i]=mapp[s];}
36 ll ans=0;
37 for (int i=1;i<=n;i++)
38 {
39 add(a[i],1);
40 ans+=i-sum(a[i]);
41 }
42 cout<<ans;
43 }