【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 ...
随机推荐
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 问题解决方法
在用maven配置mybatis环境时出现此BindingExceptiony异常,发现在classes文件下没有mapper配置文件,应该是maven项目没有扫描到mapper包下的xml文件,在p ...
- python 多线程稀疏矩阵乘法
import threading, time import numpy as np res = [] class MyThread(threading.Thread): def __init__(se ...
- Leetcode 77
//这似乎是排列组合的标准写法了已经class Solution { public: vector<vector<int>> combine(int n, int k) { v ...
- DATEADD 和 CAST 函数
where cast(soh.orderdate as date)=cast(dateadd(day,-1,getdate()) as date) 这一代码在sql 2005 不适用,使用conver ...
- SQL ltrim() 和 rtrim() 函数
LTRIM删除起始空格后返回字符表达式. 语法LTRIM ( character_expression ) 参数character_expression 是字符或二进制数据表达式.character_ ...
- 小议常被忽略的a标签:visited属性的特殊用法
CSS1/CSS2对于a定义了4个伪类, :link a标签未访问时的样式 :active a标签mousedown时的样式 :hover a标签mouseover时的样式 :visited ...
- PHP:第二章——PHP中的流程控制语句
if语句的集中形式 <?php /*if(条件) 语句; if(条件){语句块} if(条件){语句或语句块}else{语句或语句块} if(条件){语句或语句块}elseif(条件){语句或语 ...
- NodeJS类型定义方式
最近在学习nodejs,就是因为它比较轻便,并发量大,上手快.由于以前一直在做C#的后端,没有接触过javascript,所以还得慢慢学习之. nodejs所用的是javascript语言,它没有如C ...
- L1-018 大笨钟
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉.不过由于笨钟自己作息也不是很规律,所以敲钟并不定时.一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那 ...
- Linux->卸载Mysql方法总结
如何在Linux下卸载MySQL数据库呢? 下面总结.整理了一下Linux平台下卸载MySQL的方法. MySQL的安装主要有三种方式:二进制包安装(Using Generic Binaries).R ...