您的位置:首页 > 其它

BZOJ 1303 [CQOI2009]中位数图

2016-10-01 16:38 302 查看
暴力

对于b而言,b+1和b+2的贡献都是一样的,所以只要考虑数字是比b大或比b小,分别记为+1,-1,b自己记为0。left[i]表示从b那一位开始向左的子串中累加值为i的方案数,right同理,于是乘一下就好了

#include<cstdio>
#define N 100005
using namespace std;
int a
, left[2*N], right[2*N], pos;
int main()
{
int n, b;
scanf("%d%d",&n,&b);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
if(a[i]==b)pos=i,a[i]=0;
else a[i]=a[i]>b?1:-1;
}
int sum=0;
for(int i = pos; i; i--)
left[n+(sum+=a[i])]++;
sum=0;
for(int i = pos; i <= n; i++)
right[n+(sum+=a[i])]++;
int ans=0;
for(int i = -n; i <= n; i++)
ans+=left[i+n]*right[-i+n];
printf("%d\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: