链接:https://www.nowcoder.com/acm/contest/172/A
来源:牛客网

题目描述

小N得到了一个非常神奇的序列A。这个序列长度为N,下标从1开始。A的一个子区间对应一个序列,可以由数对[l,r]表示,代表A[l], A[l + 1], ..., A[r]这段数。对于一个序列B[1], B[2], ..., B[k],定义B的中位数如下:
1. 先对B排序。得到新的序列C。
2. 假如k是奇数,那么中位数为。假如k为偶数,中位数为
对于A的所有的子区间,小N可以知道它们对应的中位数。现在小N想知道,所有长度>=Len的子区间中,中位数最大可以是多少。

输入描述:

第一行输入两个数N,Len。
第二行输入序列A,第i个数代表A[i]。

输出描述:

一行一个整数,代表所有长度>=Len的子区间中,最大的中位数。

输入例子:
11 3
4864 8684 9511 8557 1122 1234 953 9819 101 1137 1759
输出例子:
8684

-->

示例1

输入

复制

11 3
4864 8684 9511 8557 1122 1234 953 9819 101 1137 1759

输出

复制

8684

备注:

数据范围:
30%: n <= 200
60%: n <= 2000
另外有20%:不超过50个不同的数
100%:1<=Len<=n<=10^5, 1 <= a[i] <= 10^9

题目要求求区间最大中位数。

最暴力的方法就是枚举每一个区间,然后将区间排序,查询中位数。

稍微有话一下上边做法,就维护一个单调序列,查询中位数。

然后看到网上还有一种做法,查询中位数当做查询区间第k大的数,用到了什么叫划分树的东西,枚举区间然后查询,貌似是一有80分。

正解二分答案+前缀和:

既然要二分答案,就需要序列有序,那么另开一个数组,储存序列排序,用于二分。

那么对于每个二分的数,那么我们怎么来判断呢?

对于每个数字x,我们对于每个判断序列中有多少个比x大的数和比x小的数,为了方便判断,预处理一个数组C,原序列中的数大于等于x,C[i]=1,否则C[i]=-1;

我们判断这个数是不是中位数,那么就要让小于它的数和大于等于它的数数量相等。

循环判断,当现枚举的长度大于等于想要的长度时,找出左边最少有多少个比它小的数,往右找到比它大的数。

if(i>=len)ban=min(ban,c[i-len]);

我们每次前缀和,统计+1和-1的数量差。

c[i]+=c[i-];

满足条件go on!!

if(i>=len&&c[i]-ban>)return ;

总的时间复杂度$O(nlongn)$

代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define LL long long
int read()
{
int sum=,fg=; char c=getchar();
while(c<''||c>''){ if(c=='-')fg=-;c=getchar(); }
while(c>=''&&c<=''){ sum=sum*+c-'';c=getchar(); }
return sum*fg;
}
int n,len,a[],b[];
int c[],ban,ans;
bool check(int x)
{
ban=;
for(int i=;i<=n;i++)
if(a[i]>=x)c[i]=; else c[i]=-;
bool flag=;
for(int i=;i<=n;i++)
{
if(a[i]==x)flag=;
if(i>=len)ban=min(ban,c[i-len]);
c[i]+=c[i-];
if(i>=len&&c[i]-ban>)return ;
}
return ;
}
int main()
{
scanf("%d%d",&n,&len);
for(int i=;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b++n);
int l=n/,r=n;
while(l<=r)
{
int mid=(l+r)/;
if(check(b[mid]))ans=b[mid],l=mid+;
else r=mid-;
}
printf("%d",ans);
}

牛客noip前集训营(第一场)提高T1的更多相关文章

  1. 2020牛客NOIP赛前集训营-普及组(第二场)A-面试

    面 试 面试 面试 题目描述 牛牛内推了好多人去牛客网参加面试,面试总共分四轮,每轮的面试官都会对面试者的发挥进行评分.评分有 A B C D 四种.如果面试者在四轮中有一次发挥被评为 D,或者两次发 ...

  2. 2020牛客NOIP赛前集训营-普及组(第二场) 题解

    目录 T1 面试 描述 题目描述 输入描述: 输出描述: 题解 代码 T2 纸牌游戏 描述 题目描述 输入描述: 输出描述: 题解 代码 T3 涨薪 描述 题目描述 输入描述: 输出描述: 题解 代码 ...

  3. 2020牛客NOIP赛前集训营-提高组(第三场)C-牛半仙的妹子Tree【虚树,最短路】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7609/C 题目大意 给出\(n\)个点的一棵树,\(m\)个时刻各有一个操作 标记一个点,每个点被标记后的每 ...

  4. 2020牛客NOIP赛前集训营-提高组(第三场) C - 牛半仙的妹子Tree (树链剖分)

    昨天教练问我:你用树剖做这道题,怎么全部清空状态呢?    我:???不是懒标记就完了???    教练:树剖不是要建很多棵线段树吗,不止log个,你要一个一个清?    我:为什么要建很多棵线段树? ...

  5. 2020牛客NOIP赛前集训营-提高组(第二场)- B.包含 (FWT)

    题面 题解 这题就是个快速沃尔什变换的模板题,输入ai时,令s[ai]=1,对s[]做一遍DWT_AND(s)(快速沃尔什正变换,按位与),然后直接访问s[x]完事. #include<map& ...

  6. 2022牛客OI赛前集训营-提高组(第一场) 奇怪的函数 根号很好用

    奇怪的函数 考虑暴力,每次查询\(O(n)\)扫所有操作,修改\(O(1)\) 这启发我们平衡复杂度,考虑分块. 观察题目性质,可以发现,经过若干次操作后得到的结果一定是一个关于\(x\)的分段函数, ...

  7. 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)

    链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...

  8. 牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)

    链接: https://www.nowcoder.com/acm/contest/139/F 题意: 分析: 转载自:http://tokitsukaze.live/2018/07/19/2018ni ...

  9. 牛客寒假基础集训营 | Day1 G-eli和字符串

    G-eli和字符串 题目描述 eli拿到了一个仅由小写字母组成的字符串. 她想截取一段连续子串,这个子串包含至少 kkkkkkkkk 个相同的某个字母. 她想知道,子串的长度最小值是多少? 注:所谓连 ...

随机推荐

  1. tomcat复习

    javaEE 服务器: java企业版服务器:是一个标准 BS/CS: 1> CS: client/Server 优点:易操作性比较高 缺点:客户端需要升级维护. 2> BS: Brows ...

  2. jQuery笔记之位置图形

    位置图形: 位置坐标图形大小相关方法: .offset() .position() .scrollTop()..scrollLeft() .width().height() .innerWidth() ...

  3. android ViewPager 与Fragment

    ViewPager 左右滑动数据显示 1. 整体布局 FragmentLayout 容器包裹Fragment <?xml version="1.0" encoding=&qu ...

  4. Query on a tree again! SPOJ - QTREE3

    https://vjudge.net/problem/SPOJ-QTREE3 https://www.luogu.org/problemnew/show/P4116 一个log(LCT)比两个log( ...

  5. EXBSGS

    http://210.33.19.103/problem/2183 参考:https://blog.csdn.net/frods/article/details/67639410(里面代码好像不太对) ...

  6. 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty

    题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...

  7. 题解报告:hdu 4607 Park Visit(最长链)

    Problem Description Claire and her little friend, ykwd, are travelling in Shevchenko's Park! The par ...

  8. zoj3772Calculate the Function(矩阵+线段树)

    链接 表达式类似于斐波那契 但是多了一个变量 不能用快速幂来解 不过可以用线段树进行维护 对于每一个点够一个2*2的矩阵 1 a[i] 1  0   这个矩阵应该不陌生 类似于构造斐波那契的那个数列 ...

  9. tcpdump 使用详解——转载

    http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 简介 用简单的话来定义tcpdump,就是:dump the traf ...

  10. FPGA开发中的脚本语言

    多数FPGA开发者都习惯图形化界面(GUI).GUI方式简单易学,为小项目提供了一键式流程.然而,随着FPGA项目越来越复杂,在很多情况下GUI工具就阻碍了工作效率.因为GUI工具不能对整个开发过程提 ...