JZOJ 3240. Seat

题目

Description

你和你的伙伴正在筹备村里的万人宴,由于村子是长条形的,所有宾客将坐在一张超级长桌的一侧就餐。

正当筹备工作进行得火热朝天,你和你的伙伴发现一个严重问题:由于缺乏沟通,你俩各自制作了一张座位图发给各位宾客。你必须计算出有多少对宾客,他们在两份座位图中次序安排是不同的。

例如,对以下两份座位图:

A B C D E

B A D E C

有三对宾客(A,B),(C,D)和(C,E),他们在两份座位图中的次序不同。
 

Input

输入的第一行是一个整数N(1<=N<=100000),代表宾客的数量。接下来的两行分别代表两张座位图。每行由N个空格分隔的字符串组成,这些字符串代表宾客,宾客名互不相同,只包含字母,长度不超过5个字符。两张座位图上的宾客名单保证是一致的。

Output

输出一个整数,代表有多少对宾客被两份座位图安排了不同的次序。
 

Sample Input

输入1:
3
Frank Sam Billy
Sam Frank Billy

输入2:
5
A B C D E
B A D E C
 

Sample Output

输出1:
1

输出2:
3
 

Data Constraint

1<=N<=100000

分析

 

  • 这道题乍一看,哦不就是个逆序对吗
  • 用个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 }

 

posted @ 2019-07-01 19:15  Melted_czj  阅读(93)  评论(0编辑  收藏  举报
body { background-color:whitesmoke; } // 修改背景颜色为半透明 #home,#sideBarMain>div,#blog-sidecolumn>div>div,.catListView{ background-color:rgba(255,255,255,0); } // 修改其他边框的颜色