【CQOI2008】中位数
题不难,但是思路有意思,这个是我自己想出来的OvO
原题:
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。
n<=100000
刚看这道题的时候看n滋瓷nlogn的复杂度,又是维护区间关系的,觉得应该要用数据结构
然后开始想数据结构,思考中位数的特殊性,题目中限定子序列的长度为奇数,b是一个长度为奇数的序列的中位数就说明在这个序列中比b大的数和比b小的数相等
子序列中的东西有多少个,这个可以用前缀搞
然后发现让前缀中比b大的数和比b小的数做差,如果两个前缀和相等的话,说明这个这两个前缀和中间的区间比b大的数和比b小的数相等
证明的话可以设前缀和a,b比b大和比b小的数分别为(x1,y1),(x2,y2),差的前缀和为y1-x1,y2-x2,这两个前缀和中间比b大的数有x2-x1,比b小的有y2-y1,如果两个差的前缀和相等,则y1-x2=y2-x2,移项就可以得到x2-x1=y2-y1,满足子序列中比b大的数个数和比b小的数个数相等,即这个子序列的中位数就是b
子序列长度为奇数的条件很好满足,因为我们是两个前缀和相减,所以可以把前缀和分成两份,分别是右顶点为奇数和偶数的前缀和,让两个奇偶性不同的前缀和相减就可以了
具体怎么搞的话,就是搞一个cnt记录直到第i个数比b大的数个数减比b小的数个数是多少,每次看和i奇偶性相反,值为cnt的前缀和个数有多少个,加到答案上即可
不用记录前缀和,直接搞一个计数,s[i][j]表示值为i,奇偶性为j的前缀和有多少个就可以辣
两个前缀和的值相等但是这两个前缀和中间的子序列中没有出现b的情况是不存在的,因为子序列一定是奇数,没有b出现的话,一个数要么比b大,要么比b小,奇数个数没法平分
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
int n,m,s[][];
int main(){//freopen("ddd.in","r",stdin);
cin>>n>>m;
int u,cnt=,ans=;
s[n][]=;
for(int i=;i<=n;++i){
u=read();
if(u!=m) cnt+=u>m?:-;
ans+=s[cnt+n][i&^];//先与1判断奇偶,然后再^1取到和i奇偶性相反的奇偶性
s[cnt+n][i&]++;
}
cout<<ans<<endl;
return ;
}
【CQOI2008】中位数的更多相关文章
- bzoj1303[CQOI2008]中位数图 / 乱搞
题目描述 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 输入输出格式 输入格式: 第一行为两个正整数n和b,第二行为1 ...
- [LeetCode] Find Median from Data Stream 找出数据流的中位数
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
- [LeetCode] Median of Two Sorted Arrays 两个有序数组的中位数
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- BZOJ1303 [CQOI2009]中位数图
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 在MySQL中,如何计算一组数据的中位数?
要得到一组数据的中位数(例如某个地区或某家公司的收入中位数),我们首先要将这一任务细分为3个小任务: 将数据排序,并给每一行数据给出其在所有数据中的排名. 找出中位数的排名数字. 找出中间排名对应的值 ...
- AC日记——中位数 洛谷 P1168
题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], …, A[2k - 1]的中位数.[color=red]即[/color] ...
- [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)
题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...
- LeetCode 4 Median of Two Sorted Arrays 查找中位数,排除法,问题拓展 难度:1
思路:设现在可用区间在nums1是[s1,t1),nums2:[s2,t2) 1.当一个数组可用区间为0的时候,由于另一个数组是已经排过序的,所以直接可得 当要取的是最小值或最大值时,也直接可得 2. ...
- BZOJ 1303 CQOI2009 中位数图 水题
1303: [CQOI2009]中位数图 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2340 Solved: 1464[Submit][Statu ...
随机推荐
- 【Android】查看包名和首启动activity
工具:aapt 位置:$ANDROID_HOME/build-tools/版本号/aapt 需要配置环境变量才能使用 aapt dump badging XXXapk 输出信息中重要的有: packa ...
- Django MySQL数据库操作
上一篇文章写了一些基本的Django操作,下面重点介绍数据库的内容. 对象之间的关系: 一对一 一对多 多对多 1.一对多 先演示一对多的关系,多个blog对应一个名字, 修改blog/models. ...
- 20161210xlVBA一行数据转为四行
Sub NextSeven_CodeFrame() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAlerts = Fal ...
- Superset
Superset是一款可自助.可交互,可视化非常不错的产品 Superset is a data exploration platform designed to be visual, intuiti ...
- OA项目(MVC项目)
1. 新建,项目,其他项目类型,空白解决方案 2. 选中解决方案,添加,新建项目,类库: (1)添加OA.Model,删除其中的Class1.cs (2)添加OA.DAL(数据访问层),删除Class ...
- mahout推荐系统
本章包含以下内容: 首先看一下实战中的推荐系统 推荐引擎的精度评价 评价一个引擎的准确率和召回率 在真实数据集:GroupLens 上评价推荐系统 我们每天都会对喜欢的.不喜欢的.甚至不关心的事情有很 ...
- 基于嵌入式Linux的千兆以太网卡驱动程序设计及测试
一. 引言 千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循IEEE 802.3规范标准.采用和10M以太网相似的帧格式.网络协议和布线系统,基于光纤和短距离同轴电缆的物理层介质,更适用于 ...
- Our supersheet
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Struts2内置校验器——完整实例代码
一.校验器的配置风格 1.字段校验器: <field name="被校验的字段"> <field-validator type="校验器名"& ...
- 【转】Linux编程之UDP SOCKET全攻略
转自:http://www.cnblogs.com/skyfsm/p/6287787.html?utm_source=itdadao&utm_medium=referral 这篇文章将对lin ...