码迷,mamicode.com
首页 > 其他好文 > 详细

[CQOI]中位数

时间:2018-09-24 16:58:12      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:数据规模   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 } 

 

[CQOI]中位数

标签:数据规模   cst   中位数   poi   include   位置   ace   cout   pre   

原文地址:https://www.cnblogs.com/lcan/p/9695503.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!