【题解】Luogu P1627 [CQOI2009] 中位数 排序
基本算法3-2
大概是用到了排序...吧...
计数排序?简单的O(n+k)排序,k为max−min
思想?另开一个数组记录每个数的出现次数,从小到大扫一遍 ->可视化
因为要求的是中位数,只关心和目标数的大小关系,所以把比b小的设为−1,大的设为1
最后的答案即为 在b前面的−1数量 等于 b后面的1的数量 (就是这一段的和为0时)
∑n∗2−1i=0l[sum[i]]∗r[sum[i]]
因为有负下标所以+n后数组要开大一倍
code
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 namespace gengyf{ 4 #define ll long long 5 const int maxn=2e5+10; 6 inline int read(){ 7 int f=1,x=0;char s=getchar(); 8 while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} 9 while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} 10 return f*x; 11 } 12 int n,b,a[maxn],pos,x[maxn],ans; 13 int sum[maxn],l[maxn],r[maxn]; 14 int main(){ 15 n=read();b=read();x[b]=0; 16 for(int i=1;i<=n;i++){ 17 a[i]=read();if(a[i]==b)pos=i; 18 if(a[i]>b)x[i]=1; 19 if(a[i]<b)x[i]=-1; 20 } 21 l[n]=1;r[n]=1; 22 for(int i=pos-1;i>=1;i--){ 23 sum[i]=sum[i+1]+x[i];l[sum[i]+n]++; 24 } 25 for(int i=pos+1;i<=n;i++){ 26 sum[i]=sum[i-1]+x[i];r[sum[i]+n]++; 27 } 28 for(int i=0;i<2*n;i++){ 29 ans+=l[i]*r[n-i+n]; 30 } 31 printf("%d",ans); 32 return 0; 33 } 34 } 35 signed main(){ 36 gengyf::main(); 37 return 0; 38 }
标签:
基本算法-排序
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现