会议座位
传送门
题目背景
话说校长最近很喜欢召开全校教职工大会,让老师们强行听他装逼
题目描述
现在校长在校园网上公布了一份座位表, n n n 位老师从左到右依次排成一行。老师们都对这个座位很满意。
然而到了开会时,校长不小心把座位表打乱了,老师们很不满。老师们并不在意自己的位置变了多少,但如果有一对老师 a a a 和 b b b,他们原来的座位是 a a a 在 b b b 左边,现在变成了 a a a 在 b b b 右边,那么这一对老师便会贡献一单位不满值。
校长想知道这些老师的总不满值是多少。
输入格式
第一行一个正整数 n n n,为 n n n 位老师。
第二行有 n n n 个字符串,每个字符串代表老师的名字(大小写敏感)。这一行代表原来的座位表。
第三行有 n n n 个字符串,代表打乱后的座位表。
输出格式
一行,一个正整数,表示老师们的总不满值。
样例 #1
样例输入 #1
3
Stan Kyle Kenny
Kyle Stan Kenny
样例输出 #1
1
样例 #2
样例输入 #2
5
A B C D E
B A D E C
样例输出 #2
3
提示
对于 30 % 30\% 30% 的数据, 1 ≤ n ≤ 1 0 3 1\le n \le 10^3 1≤n≤103。
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 5 1\le n \le 10^5 1≤n≤105,每位老师名字长度不超过 5 5 5,只有大小写字母并且互不相同。注意名字对大小写敏感。
注明
以上来自洛谷 以上来自洛谷 以上来自洛谷
解题思路
温馨提示,建议你好好读题。 如果你还没思路,再往上看。
题目提到:
老师们并不在意自己的位置变了多少,但如果有一对老师 a a a 和 b b b,他们原来的座位是 a a a 在 b b b 左边,现在变成了 a a a 在 b b b 右边,那么这一对老师便会贡献一单位不满值。
由此可得,题目要求为,给你原始顺序序列以及打乱后的序列,求逆序对个数。不一样的是,将原本整型元素改为了字符串。
如果你不会逆序对求法,那么建议你先做这题。
AC Code
#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void Quick_Write(T x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) Quick_Write(x / 10);
putchar(x % 10 + '0');
return;
}
struct Project_String {
string _string, a;
} String[100005];
int n;
string a[100005], b[100005];
long long Answer;
inline void Merge_Sort(int left, int right) {
if (left >= right) return;
int middle = ((right - left) >> 1) + left;
Merge_Sort(left, middle), Merge_Sort(middle + 1, right);
int i = left, j = middle + 1, k = left;
while (i <= middle && j <= right) {
if (a[i] < a[j]) b[k++] = a[i++];
else b[k++] = a[j++], Answer += middle - i, ++Answer;
}
while (i <= middle) b[k++] = a[i++];
while (j <= right) b[k++] = a[j++];
for (register int i = left; i <= right; ++i) a[i] = b[i];
}
inline bool Compar(Project_String x, Project_String y) {
return x._string < y._string;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cin >> n;
for (register int i = 1; i <= n; ++i) cin >> String[i]._string;
for (register int i = 1; i <= n; ++i) cin >> String[i].a;
sort(String + 1, String + n + 1, Compar);
for (register int i = 1; i <= n; ++i) a[i] = String[i].a;
Merge_Sort(1, n), Quick_Write(Answer);
return 0;
}
这部分不是题解,但建议你看看
注意到洛谷给到的此题标签为:
虽说这道题可以用 Trie 树解,但至于吗?
然后是题解中对此题的一些评价:
最后,本人的疑问:这题是怎么把时间卡到 200ms 以内的?(希望能在评论区看见答复)