「CQOI2009」中位数
「CQOI2009」中位数
传送门
这道题将会用到一点桶的思想。
首先我们可以在排列中先找到 \(b\) 的位置(找不到的话就直接输出 \(0\))。
然后我们从 \(b\) 的位置(设为 \(p\))开始拓展,容易发现有三种情况:
- \(b\) 在子段左边界
- \(b\) 在子段右边界
- \(b\) 在子段中间位置
我们很容易想到,对于 \(b\) 在子段边界的情况可以直接扫描,记录一下小于 \(b\) 的数和大于 \(b\) 的数的个数即可。
对于 \(b\) 在序列中间的情况可以这样做:
类比我们处理其他两种情况的方法,我们都是记录了小于 \(b\) 和大于 \(b\) 的数的个数(简记为 \(small\) 和 \(big\))
当 \(small=big\) 时,意味着当前 \(b\) 就是中位数,我们就可以将答案加一。
同样的对于这种情况,我们不难得到下面这个式子:
\]
接下来移项:
\]
那么我们就可以用桶来维护,具体方法如下:
在对一种边界情况进行处理时(以向右拓展为例),我们开一个桶 \(tong[i]\) 表示有多少种 \(big-small\) 等于 \(i\)。(为了防止数组越界可以同时加上一个数)
然后在对另一边进行处理时干一件这样的事: \(ans \text{+=} tong[small - big]\)
这样我们就完成了的三种情况的方案数统计,可以见代码。
参考代码:
/*--------------------------------
Code name: A.cpp
Author: The Ace Bee
This code is made by The Ace Bee
--------------------------------*/
#include <cstdio>
#define rg register
#define file(x) \
freopen(x".in", "r", stdin); \
freopen(x".out", "w", stdout);
const int $ = 100010;
inline int read() {
int s = 0; bool f = false; char c = getchar();
while (c < '0' || c > '9') f |= (c == '-'), c = getchar();
while (c >= '0' && c <= '9') s = (s << 3) + (s << 1) + (c ^ 48), c = getchar();
return f ? -s : s;
}
int a[$], tong[$ * 5], OFF = $ * 2;
int main() {
// file("A");
int n = read(), k = read(), p = 0;
for (rg int i = 1; i <= n; ++i)
{ a[i] = read(); if (a[i] == k) p = i; }
if (p == 0) return puts("0"), 0;
int ans = 1, s1 = 0, b1 = 0, s2 = 0, b2 = 0;
for (rg int i = p + 1; i <= n; ++i) {
if (a[i] > k) ++b2; else ++s2;
++tong[b2 - s2 + OFF];
if (s2 == b2) ++ans;
}
for (rg int i = p - 1; i >= 1; --i) {
if (a[i] > k) ++b1; else ++s1;
ans += tong[s1 - b1 + OFF];
if (s1 == b1) ++ans;
}
printf("%d\n", ans);
return 0;
}
「CQOI2009」中位数的更多相关文章
- 「SCOI2014」方伯伯的商场之旅
「SCOI2014」方伯伯的商场之旅 题目描述 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- 操作系统 - epoll中的ET和LT
参考 https://www.quora.com/What-is-meant-by-edge-triggering-and-level-triggering http://man7.org/linux ...
- win10 superfetch 使系统变慢
win10 superfetch是干什么的? 时间:2018-12-28 来源:莫回首系统 作者:win7 很多用户喜欢关注CPU的运行状态,来保障系统的运行速度不受影响,今早,有ghost win1 ...
- AcWing STL初步学习
vector, 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() beg ...
- Educational Codeforces Round 80 (Rated for Div. 2)C(DP)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ; ][],temp[][]; int ...
- c# 异常:值不能为 null。 参数名: source
异常详细信息: System.ArgumentNullException: 值不能为 null.参数名: source 其实问题那就出在 Select() 方法,在 Select 上按 F12 查看定 ...
- 李超线段树(segment[HEOI2013]-洛谷T4097)
(neng了好久好久才糊弄懂得知识点...) 一.李超线段树 在线动态维护一个二维平面直角坐标系, 支持插入一条线段, 询问与直线x = x0相交的所有线段中,交点y的最大/小值 (若有多条线段符合条 ...
- __dirname和__filename和process.cwd()三者的区别
1.process cwd() 方法返回 Node.js 进程当前工作的目录 例:我在F:\自己的文件\自己在网上学习的知识点\node学习\node-API\process 这个文件加下面创建了一个 ...
- acm数论之旅--中国剩余定理
ACM数论之旅9---中国剩余定理(CRT)(壮哉我大中华╰(*°▽°*)╯) 中国剩余定理,又名孙子定理o(*≧▽≦)ツ 能求解什么问题呢? 问题: 一堆物品 3个3个分剩2个 5个5个分剩3个 ...
- pipreqs (找当前项目依赖的包)
pipreqs pipreqs可以帮你找到当前项目的所有组件及其版本.就是当别人给你一个程序的时候,你要在自己电脑上运行起来,就需要安装程序所依赖的组件,总不能自己一个一个找吧. # 安装 pip3 ...
- Python函数基础进阶
函数参数的另一种使用方式 def print_info(name,age): print("Name: %s" %name) print("age: %d" % ...