Processing math: 100%

【题解】Luogu P1627 [CQOI2009] 中位数 排序

基本算法3-2

 


 

大概是用到了排序...吧...

 

计数排序?简单的O(n+k)排序,kmaxmin

思想?另开一个数组记录每个数的出现次数,从小到大扫一遍 ->可视化

 

因为要求的是中位数,只关心和目标数的大小关系,所以把比b小的设为1,大的设为1

最后的答案即为 在b前面的1数量 等于 b后面的1的数量 (就是这一段的和为0时)

n21i=0l[sum[i]]r[sum[i]] 

因为有负下标所以+n后数组要开大一倍

code

 

复制代码
 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 }
View Code
复制代码

 

posted @   喵の耳  阅读(157)  评论(0编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
点击右上角即可分享
微信分享提示