链接: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. PCB 线路铜皮面积(残铜率)计算的实现方法

    一个多月没更新博客园了,这里继续分享关于PCB工程相关一些知识,做过PCB工程都知道用使用genesis或incam是可以非常方便的计算得到铜皮面积这个参数[下图],但实际这个软件是通过什么算法计算出 ...

  2. AppBoxFuture(七): 分布式外键约束

      关系数据库与NoSql其中的一个主要区别是具备完整的外键约束,虽说现在一些大厂在设计数据存储结构时禁止使用外键约束,靠业务逻辑来保证数据完整性,但考虑到是人就会犯错,为了保证关键业务数据的完整性, ...

  3. POJ1270【拓扑排序+DFS】

    题意: 先给你一个字符串,让你给他们排序: 再给你一行,在这一行,每两个就是第一个需要在第二个前面: 思路: //DFS写多了感觉好有啊,就是排序过程中可能会有多种情况. //我们考虑一下怎么排好一个 ...

  4. CCF2016.4 - C题

    思路:先把路径按反斜杠split成数组,然后用一个ArrayList去模拟.如果遇到空或者.则不处理:如果遇到..则删除ArrayList最后一个元素(注意如果只有1个元素则不删除):其他情况直接加到 ...

  5. TensorFlow多线程输入数据处理框架(二)——输入文件队列

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 一个简单的程序来生成样例数据. #!/usr/bin/env python # -*- coding: UTF-8 ...

  6. python之迷宫DFS

    # @File: maze_stack_dfs maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 0, 0, 0, 1, 0, 1], [1, ...

  7. SPFA/Dijkstra POJ 3159 Candies

    题目传送门 题意:n个人发糖果,B 比 A 多 C的糖果,问最后第n个人比第一个人多多少的糖果 分析:最短路,Dijkstra 优先队列优化可过,SPFA竟然要用栈,队列超时! 代码: /****** ...

  8. Maven聚合模式

    项目的打包类型:pom.jar.war 项目中一般使用maven进行模块管理,每个模块下对应都有一个pom文件,pom文件中维护了各模块之间的依赖和继承关系.项目模块化可以将通用的部分抽离出来,方便重 ...

  9. Appium + Python自动化 - 元素定位uiautomatorviewer

    元素定位主要介绍如何使用uiautiomatorviewer,通过定位到页面上的元素,然后进行相应的点击等操作.uiautiomatorviewer是android-sdk自带的一个元素定位工具,非常 ...

  10. 498 Diagonal Traverse 对角线遍历

    详见:https://leetcode.com/problems/diagonal-traverse/description/ C++: class Solution { public: vector ...