CF2171D 题解

· · 题解

题目相当于判断:将所有满足 u<vp_u<p_vuv 连边,最后所有点是否在同一个连通块中。

我们把 p_1\sim p_n 分成两个部分 A,B,一开始,A 里面没有数,B 里面有所有数。

然后,我们从 p_1p_n 不断地将 p_iB 中移除,加入到 A 中。

在 $i=1$ 时可以连边: $p_1<\max\{B\}$ 的前提下,$i=2$ 时,如果 $\min\{p_1,p_2\}>\max\{B\}$,说明 $p_1<p_2$ 且 $p_2$ 为 $2\sim n$ 中 $p_i$ 的最大值,那么 $p_2$ 不可能和后面的点连边。 以此类推,我们只要不断比较 $\min\{A\}$ 和 $\max\{B\}$ 即可。时间复杂度 $O(n\log n)$。 ::::success[AC Code] ```cpp #include <iostream> #include <set> using namespace std; const int maxn = 2e5+5; int t,n,a[maxn]; set<int>S1,S2; int main(){ cin >> t; while(t--){ cin >> n; S1.clear();S2.clear(); for(int i = 1;i<=n;i++){ cin >> a[i]; S2.insert(a[i]); } bool flag=true; for(int i = 1;i<n;i++){ S1.insert(a[i]); S2.erase(a[i]); if(*S1.begin() > *S2.rbegin()){ flag = false;break; } } if(flag)cout<<"Yes\n"; else cout <<"No\n"; } return 0; } ``` ::::