[BZOJ 1303] CQOI 2009 中位数图 · 数学

来源:互联网 发布:传智48期php就业班 编辑:程序博客网 时间:2024/05/29 09:15

一个大于b的数和一个小于b的数可以互相抵消,所以我们用1和-1表示。

从b向两边扩展,left[i]表示b左边抵消后有i个数比b的可能数,right[i]表示b右边抵消后有i个数比b的可能数。

乘法原理得ans=sigma(left[i]*right[i]).

#include <stdio.h>#include <algorithm>#include <string.h>#include <iostream>using namespace std;const int N=100005;int n,m,ad,data[N*2],r[N*2],l[N*2],sum,ans;int main(){cin>>n>>m;for (int i=1;i<=n;i++){cin>>data[i];if (data[i]==m) ad=i;}sum=0;l[N]=r[N]=1;for (int i=ad-1;i;i--)sum+=(data[i]<m)?1:-1,l[sum+N]++;sum=0;for (int i=ad+1;i<=n;i++)sum+=(data[i]>m)?1:-1,r[sum+N]++;for (int i=N-n;i<=N+n;i++) ans+=r[i]*l[i];cout<<ans<<endl;return 0;}

0 0
原创粉丝点击