题目
有N个人有两种能量 ai bi 。
比赛被定义为随机挑选两个人随机选择一种能量,这种能量大的人获胜。
问N个人中ai是否有机会获胜
如果有输出1否则为0
题解思路
将每种能量排序,建出能量小到能量大的有向边。
这个人有可能获胜必然是某种能量大于了一种能量为最大的人或者间接大于(某种能量大于了 大于一种能量最大的人 的人 )了这个人。
我们建出图后,从能量最大的终点往回跑。能到达的点就是可以获胜的点。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 100100;
PII a[N] ;
PII b[N] ;
int f[N] ;
vector <int> head[N] ;
void dfs(int x )
{
if (f[x])
return ;
f[x] = 1 ;
for (int i = 0 ; i < head[x].size() ; i++ )
{
int sp = head[x][i] ;
dfs(sp) ;
}
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T ;
cin >> T ;
while (T--)
{
int n ;
cin >> n ;
for (int i = 1 ; i <= n ; i++ )
{
int t1 ;
cin >> t1 ;
a[i].first = t1 ;
a[i].second = i ;
f[i] = 0 ;
head[i].clear() ;
}
sort(a+1,a+1+n) ;
for (int i = 1 ; i <= n ; i++ )
{
int t1 ;
cin >> t1 ;
b[i].first = t1 ;
b[i].second = i ;
}
sort(b+1,b+1+n) ;
for (int i = 1 ; i < n ; i++ )
head[a[i].second].push_back(a[i+1].second) ;
for (int i = 1 ; i < n ; i++ )
head[b[i].second].push_back(b[i+1].second) ;
dfs(b[n].second) ;
for (int i = 1 ; i <= n ; i++ )
cout << f[i] ;
cout << "\n" ;
}
return 0 ;
}