1303: [CQOI2009]中位数图
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1215 Solved: 782
[ Submit][ Status]
Description
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。
Input
第一行为两个正整数n和b ,第二行为1~n 的排列。
Output
输出一个整数,即中位数为b的连续子序列个数。
Sample Input
7 4
5 7 2 4 3 1 6
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
【题解】出看这题时不仔细(太糟糕了),竟然忽略了第一句话,认为存在多个。头疼了半天后才知道原来只有一个。这样就好做多了。只要我们发现一段符合要求就要满足,这段包含那个给定的中位数,并且如果我们将比中位数大的数当作1,比中位数小的数当作-1,将他取一个前缀。则这段(我们表示为[l,r])必然符合sum[ r ]-sum[ l -1 ]==0,且 r-l+1 为素数,于是乎就有了答案。
#include<cstdio>
#include<cstdlib>
#define maxn 101000
int f[2][maxn*2+1000]={0},sum[maxn];
int main()
{
int n,b;
scanf("%d%d",&n,&b);
int bet=0,root;
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
if(x>b)bet++;
else if(x<b)bet--;
else root=i;
sum[i]=bet;
}
int ans=0;sum[0]=0;
for(int i=0;i<root;i++)f[i&1][sum[i]+maxn]++;
for(int i=root;i<=n;i++)
ans+=f[1-(i&1)][sum[i]+maxn];
printf("%d\n",ans);
return 0;
}