「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 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- Git 常用命令总结,掌握这些,轻松驾驭版本管理
原创 最近公司的代码管理工具要从SVN转到Git上,因此虽然之前用过Git,但是都是一些简单的推送提交,因此还是有必要进行一些系统的学习,这里做一下笔记,以备后询,且不定期更新. 关于SVN和Git的 ...
- 使用docker踩过的坑(二)
关于docker的部署,我这里不多说了 下面写一些最近经常用到的命令: docker下载镜像: docker pull 镜像名 docker查看已下载的所有镜像: docker images dock ...
- 每天进步一点点------DE2-70-TV例子说明
module Reset_Delay(iCLK,iRST,oRST_0,oRST_1,oRST_2); input iCLK; input iRST; output reg oRST_0; outpu ...
- SQL基础语法—create语句
1 Create database语句 create database 语句是在MySQL实例上创建一个指定名的数据库,create schema语句的语义和create database是一样的.先 ...
- c# /MVC设置类的自定义特性
public class MarkStaticAttribute:Attribute { public MarkStaticAttribute(bool mark=true) { _IsMark = ...
- vscode git连接github
上一篇文章中介绍了vscode中git的简单使用方法vscode git的简单使用 上次只讲到了本地库的创建,这次说明下怎么push到github上 首先需要有一个github的账号 github官 ...
- 实验四《Android程序设计》
实验四<Android程序设计> 一.实验内容 1.Android Stuidio的安装测试 2.Activity测试 3.UI测试 4.布局测试 5.事件处理测试 二.实验步骤 第一部分 ...
- EF 查询表达式 join
数据源: 1.无into,相当于 inner join var query = from p in context.P join s in context.S on p.PID equals s.PI ...
- Vue-全局变量和方法
一.单文件引入 1.创建存放全局变量和方法的vue文件 Common.uve <script> const userName = 'yangjing'; function add(a,b) ...
- Spring 事务管理的API
Spring事务管理有3个API,均为接口. (1)PlatformTransactionManager 平台事务管理器 常用的实现类: DataSourceTransactionManager ...