标签:数据规模 cst 中位数 poi include 位置 ace cout pre
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。
输入格式:
第一行为两个正整数n和b,第二行为1~n的排列。
【数据规模】
对于30%的数据中,满足n≤100;
对于60%的数据中,满足n≤1000;
对于100%的数据中,满足n≤100000,1≤b≤n。
输出格式:
输出一个整数,即中位数为b的连续子序列个数。
from 黄学长
找到b在数列中的位置设为point,比b大的赋值为-1,比b小的赋值为1;
然后求出sum[i,point]的值出现了几次记为lfre[sum[i,point]]++; ans += lfre[sum[i,point]]*rfre[-sum[i,point]];
由于c++数组不能是负数,所以稍微处理一下
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int maxn=1e6+7; 5 int n,b,tmp,ans; 6 int a[maxn],sum[maxn],lft[maxn],rgt[maxn],t[maxn]; 7 int main(){ 8 cin>>n>>b; 9 for(int i=1;i<=n;i++) cin>>a[i]; 10 for(int i=1;i<=n;i++){ 11 if(a[i]>b) t[i]=1; 12 if(a[i]==b){t[i]=0;tmp=i;} 13 if(a[i]<b) t[i]=-1; 14 } 15 lft[n]=1;rgt[n]=1; 16 for(int i=tmp-1;i>=1;i--){ 17 sum[i]=sum[i+1]+t[i];lft[sum[i]+n]++; 18 } 19 for(int i=tmp+1;i<=n;i++){ 20 sum[i]=sum[i-1]+t[i];rgt[sum[i]+n]++; 21 } 22 for(int i=0;i<2*n;i++){ 23 ans+=lft[i]*rgt[2*n-i]; 24 } 25 cout<<ans<<endl; 26 return 0; 27 }
标签:数据规模 cst 中位数 poi include 位置 ace cout pre
原文地址:https://www.cnblogs.com/lcan/p/9695503.html