P1627 [CQOI2009]中位数
链接: link.
题解:
这道题解法就是思维+前缀和,首先将可以将输入的数进行一个转化,大于
m
m
m的记为1,小于
m
m
m的记为-1,等于的记为0并记录
m
m
m的位置,然后前缀和,在
p
o
s
pos
pos前用
m
a
p
map
map记录每种值得出现个数,当
m
m
m出现后,累加的同时,开始进行计数,因为当此时
s
u
m
sum
sum在前面出现过时,就意味着存在构成情况,增减情况相等,可以手写
s
u
m
sum
sum的变化理解,
a
n
s
+
=
m
p
[
s
u
m
]
ans+=mp[sum]
ans+=mp[sum]
才开始读错了题意,正确思路只想出了一半,后面还是看了题解的。
#include<bits/stdc++.h>
using namespace std;
int b[100010],sum;
int main()
{
int n,m;
cin>>n>>m;
int a,pos;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
if(a>m)b[i]=1;
else if(a<m)b[i]=-1;
else b[i]=0,pos=i;
}
sum=0;
map<int,int>mp;
mp[0]++;
for(int i=1;i<pos;i++)
{
sum+=b[i];
mp[sum]++;
}
int ans=0;
for(int i=pos;i<=n;i++)
{
sum+=b[i];
ans+=mp[sum];
}
cout<<ans<<endl;
}