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"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2017-11-06 2017 清北济南考前刷题Day 5 afternoon
2017-11-06 2017 清北济南考前刷题Day 5 morning
2017-11-06 2017 清北济南考前刷题Day 4 afternoon
2017-11-06 2017 清北济南考前刷题Day 4 morning
2017-11-06 2017 清北济南考前刷题Day 3 morning