bzoj 1303中位数图
Description
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。
Input
第一行为两个正整数n和b ,第二行为1~n 的排列。
Output
输出一个整数,即中位数为b的连续子序列个数。
Sample Input
7 4
5 7 2 4 3 1 6
Sample Output
4
Hint
第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}
N<=100000
Source
CQOI2009
题解
看了hzwer的题解才明白0 .0
我太蒟不想说什么了……
一个数比k小的时候置为-1 比k大置为+1 查询一段区间和如果为0则满足条件(比k大的和比k小的个数相同)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100010;
int l[2*maxn],r[2*maxn],num[maxn],sum[maxn];
int main()
{
int n,k,p;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
if(num[i]<k)sum[i]=-1;
else if(num[i]>k)sum[i]=1;
if(num[i]==k)p=i;
}
for(int i=1;i<=n;i++)
sum[i]+=sum[i-1];
for(int i=0;i<p;i++)
l[sum[i]+n]++;
for(int i=p;i<=n;i++)
r[sum[i]+n]++;
int ans=0;
for(int i=0;i<=2*n;i++)
ans=(ans+l[i]*r[i]);
printf("%d",ans);
return 0;
}
刚开始忘了负数条件……后来数组开小了……一直WA QAQ
——既然选择了远方,便只顾风雨兼程