hdu4908(中位数)

传送门:BestCoder Sequence

题意:给一个序列,里面是1~N的排列,给出m,问以m为中位数的奇数长度的序列个数。

分析:先找出m的位置,再记录左边比m大的状态,记录右边比m大的状态,使得左右两边状态平衡(和为0)就是满足的序列。

举例:

7 4

1 5 4 2 6 3 7

ans=8

m的位置pos=3:0

左边:0  1

右边:-1 0 -1 0

那么左边的0可以和右边的两个0组合(<1 5 4 2 4>,<1 5 4 2 6 3 7>).

左边的1和右边的两个-1组合(<5 4 2>,<5 4 2 6 3>).

中间pos可以和左右两边为0的组合还有自己本身(<1 5 4>,<4 2 6>,<4 2 6 3 7>,<4>)

因此总共8个。

5 3

1 2 3 4 5

ans=3

3的位置pos=3:0

左边:-2 -1

右边:1 2

左边-1可以和右边1可以组合(<2 3 4>)

左边-2和可以右边-2组合(<1 2 3 4 5>).

加上自己本身,因此ans=3.

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <limits.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 60010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
inline int read()
{
    char ch=getchar();int x=0,f=1;
    while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch<=‘9‘&&ch>=‘0‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int n,m,pos;
int a[N<<1],c[N<<1];
int main()
{
    while(scanf("%d%d",&n,&m)>0)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]==m)pos=i;
        }
        int res=0,ans=1;
        memset(c,0,sizeof(c));
        for(int i=pos-1;i>=1;i--)
        {
            if(a[i]>m)res++;
            else res--;
            if(res==0)ans++;
            c[res+n]++;//记录某种状态数量
        }
        res=0;
        for(int i=pos+1;i<=n;i++)
        {
            if(a[i]>m)res++;
            else res--;
            if(res==0)ans++;
            ans+=c[n-res];//加上左边记录下来的相反状态之和
        }
        printf("%d\n",ans);
    }
}

时间: 2024-10-13 02:31:35

hdu4908(中位数)的相关文章

hdu4908 &amp; BestCoder Round #3 BestCoder Sequence(组合数学)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4908 BestCoder Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 618    Accepted Submission(s): 214 Problem Description Mr Potato is a code

HDU4908——BestCoder Sequence(BestCoder Round #3)

BestCoder Sequence Problem DescriptionMr Potato is a coder.Mr Potato is the BestCoder.One night, an amazing sequence appeared in his dream. Length of this sequence is odd, the median number is M, and he named this sequence as Bestcoder Sequence.As th

2-13. 两个有序序列的中位数(25)(ZJUPAT )

题目链接:http://pat.zju.edu.cn/contests/ds/2-13 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A0, A1-AN-1的中位数指A(N-1)/2的值,即第[(N+1)/2]个数(A0为第1个数). 输入格式说明: 输入分3行.第1行给出序列的公共长度N(0<N<=100000),随后每行输入一个序列的信息,即N个非降序排列的整数.数字用空格间隔. 输出格式说明: 在一行中输出两个输入序列的并集序列的中位数. 样例输入与

滑动窗口的中位数

2017年8月7日 19:46:26 难度:困难 描述:给定一个包含 n 个整数的数组,和一个大小为 k 的滑动窗口,从左到右在数组中滑动这个窗口,找到数组中每个窗口内的中位数.(如果数组个数是偶数,则在该窗口排序数字后,返回第 N/2 个数字.) 样例: 对于数组 [1,2,7,8,5], 滑动大小 k = 3 的窗口时,返回 [2,7,7] 最初,窗口的数组是这样的: [ | 1,2,7 | ,8,5] , 返回中位数 2; 接着,窗口继续向前滑动一次. [1, | 2,7,8 | ,5],

(LCA+树上主席树)FZU 2237 - 中位数

题意: 多次查询一个树链上的中位数(其实就是求K大). 分析: 感觉莫队可做,只是不会树上莫队.. 而且这里是边权,处理起来貌似有点小麻烦.. 后来发现其实貌似是一个很老的题,,kuangbin模板书上有类似的题. 树链上的第K大数,这是一道可以用主席树解的题,复杂度才nlogn. 这里也是这样先求从根到每个点的线段树,以为树存在父子关系,所有可以从让下层继承上层的线段树,非常符合主席树的可持久化思想. 然后在查询第K大的时候,去掉重复部分,就可以查了. 太强了,,, 代码: 1 #includ

leetcode链表--13、median-of-two-sorted-arrays(两个排序数组的中位数,时间复杂度)

题目描述 There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 题目解析:本题关键之处在于时间复杂度要求为O(log(m+n)),本题如果采用合并并排序两数组的方式,时间复杂度为O((m+n)*log(n+m))但是在牛客网上

BZOJ 2653: middle [主席树 中位数]

传送门 题意: 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数. 我会使用一些方式强制你在线. 最后一句话太可怕了$QAQ$ 首先需要知道怎么求中位数: 二分答案,$\ge$的为$1$,$<$的为$-1$,如果和$\ge 0$说明当前答案$\le$中位数 最大中位数?$GSS$! 只要求$[a,b].rm+(b,c)

中位数

[题目描述] 现给定一个1~N的数列,询问该数列有多少个长度为奇数的连续子序列的中位数为K. [输入描述] 第一行输入两个正整数N和K: 第二行输入1~N的数列. [输出描述] 输出一个整数,表示中位数为K的连续子序列个数. [样例输入] 7 4 5 7 2 4 3 1 6 [样例输出] 4 [数据范围及提示] 样例中的子序列为:{4}.{7,2,4}.{5,7,2,4,3}和{5,7,2,4,3,1,6}. 对于30%的数据,n <= 100: 对于50%的数据,n <= 10000: 对于

bzoj 1303: [CQOI2009]中位数图

1 #include<cstdio> 2 #include<iostream> 3 #define M 100005 4 using namespace std; 5 int a[M],l[2*M],r[2*M],sum[M],n,m,p,ans; 6 int main() 7 { 8 scanf("%d%d",&n,&m); 9 for(int i=1;i<=n;i++) 10 { 11 scanf("%d",&