CF1526 D. Omkar and Medians
题意:
给出一个长为n的数组b,问是否存在一个长为2n-1的数组a,满足b[i]是a中前2*i-1个数的中位数
设已经确保b中前i个数都满足条件
现在判断b[i+1]是否满足
因为b[i]满足条件,
所以已经构造出了一个a数组,设c是a按升序排列结果,满足c[i]=b[i]
此时c[i]前、后各有i-1个数
若b[i+1]=b[i],加2各b[i]进去即可满足条件
若b[i+1]>b[i],要求b[i+1]和一个未知数加入c数组后,满足b[i+1]=c[i+1],且b[i+1]前、后各有i个数
在没有把b[i+1]加入c数组之前,b[i]后面有i-1个数
现在把b[i+1]和一个未知数加入c数组,要求b[i+1]后面有i个数
又因为b[i+1]一定在b[i]后面
所以原先b[i]后面的i-1个数也都要在b[i+1]后面,再加上那个未知数凑够i个数
即不能存在一个b[j],满足j<i且b[i]<b[j]<b[i+1]
若b[i+1]<b[i],同理可得不能存在一个b[j],满足j<i且b[i+1]<b[j]<b[i]
#include<bits/stdc++.h> using namespace std; #define N 200004 int a[N]; set<int>s; set<int>::iterator it; int main() { int T,n; bool ok; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); s.clear(); s.insert(a[1]); ok=true; for(int i=2;i<=n && ok;++i) { if(a[i]>a[i-1]) { it=s.upper_bound(a[i-1]); if(it!=s.end() && *it<a[i]) ok=false; } else if(a[i]<a[i-1]) { it=s.lower_bound(a[i-1]); if(it!=s.begin()) { --it; if(*it>a[i]) ok=false; } } s.insert(a[i]); } if(ok) printf("YES\n"); else printf("NO\n"); } }