BZOJ1303 [CQOI2009]中位数图 差分+前缀和

来源:互联网 发布:pc端口 命令 编辑:程序博客网 时间:2024/05/29 04:59
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。
差分。找到b在数列中的位置设为pos,比b大的赋值为-1,比b小的赋值为1.

再对pos左边做后缀和,右边做前缀和.

因为数组下标不能为负,所以累加时+n.

乘法原理统计答案.

#include<bits/stdc++.h>#define LL long long#define clr(x,i) memset(x,i,sizeof(x))using namespace std;const int N=100005;int n,b,pos,sum[N],l[N*2],r[N*2];int main(){scanf("%d%d",&n,&b);for(int i=1,x;i<=n;i++){scanf("%d",&x);if(x<b)sum[i]=-1;if(x>b)sum[i]=1;if(x==b)pos=i,sum[i]=0;}l[0+n]=r[0+n]=1;for(int i=pos-1;i>0;i--)  sum[i]+=sum[i+1],l[sum[i]+n]++;for(int i=pos+1;i<=n;i++)  sum[i]+=sum[i-1],r[sum[i]+n]++;LL ans=0;for(int i=0;i<2*n;i++)  ans+=(LL)l[i]*r[2*n-i];printf("%lld",ans);return 0;}



原创粉丝点击