题目链接:Game Master
题目大意:
有n名玩家和两张地图,已知每名玩家在每张地图上的战斗力,一共进行n-1场比赛,每次比赛选择一张地图和两名玩家,战斗力强的玩家最终获胜,问每名玩家是否能赢得最终的比赛。
解题思路:
将n名玩家在第一张地图上的战斗力进行升序排序,可知最后一名玩家一定可以赢得比赛,然后进行倒序查找,判断当前玩家在第二张地图上的战斗力是否大于已知可以赢得比赛的所有玩家在第二张地图上战斗力的最小值,若大于,则该玩家及之后的所有玩家都可以赢得比赛,因为之后的玩家在第一张地图上的战斗力都比该玩家的战斗力强。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
struct node
{
int a, b, idx;
}s[N];
bool cmp(node a, node b) { return a.a < b.a; }
int ans[N];
int main()
{
int t; cin >> t;
while (t--)
{
int n; cin >> n;
for (int i = 1; i <= n; i++)
{
ans[i] = 0;
s[i].idx = i;
}
for (int i = 1; i <= n; i++) cin >> s[i].a;
for (int i = 1; i <= n; i++) cin >> s[i].b;
sort(s + 1, s + 1 + n, cmp);
ans[s[n].idx] = 1;
int mn = s[n].b, idx = n;
for (int i = n - 1; i >= 1; i--)
{
if (s[i].b > mn)
{
for (int j = i; j < idx; j++)
{
ans[s[j].idx] = 1;
mn = min(mn, s[j].b);
}
idx = i;
}
}
for (int i = 1; i <= n; i++) cout << ans[i];
cout << endl;
}
return 0;
}