【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 ...
随机推荐
- SVN使用流程
- 雷林鹏分享:C# 匿名方法
C# 匿名方法 我们已经提到过,委托是用于引用与其具有相同标签的方法.换句话说,您可以使用委托对象调用可由委托引用的方法. 匿名方法(Anonymous methods) 提供了一种传递代码块作为委托 ...
- 3-23 Rspec自动化测试(开始练习)
闰年程序 leap_year_spec.rb require_relative './leap_year' describe "Leap Year" do it "201 ...
- python-day49--前端 html
一.列表标签 1.有序列表 <ol> (order list ) 在浏览器中显示包括:padding , 有序排列 <li>:列表中的每一项. 2.无序列表 ...
- hdu1864(01包)
最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 获取和设置消息队列的属性msgctl,删除消息队列
消息队列的属性保存在系统维护的数据结构msqid_ds中,用户可以通过函数msgctl获取或设置消息队列的属性. int msgctl(int msqid, int cmd, struct msqid ...
- sqlite 查询数据库中所有的表名,判断某表是否存在,将某列所有数值去重后获得数量
1.列出当前db文件中所有的表的表名 SQL语句:SELECT * FROM sqlite_master WHERE type='table'; 结构如下: 注:网上有人说可以带上db文件的名称,如: ...
- learning uboot test command
uboot commad test test - minimal test like /bin/sh so we can use test command to some judge for exam ...
- scrapy-redis基础和介绍
一.scrapy-redis(0.6)依赖的环境 Scrapy >= 1.0.0 #终于过了1版本,这个太重要了,总算坑小了点,感谢那些为了解决各种scrapy与s ...
- bzoj2438
题解: tarjan+概率 首先tarjan缩点 然后计算一个x,计算方法: 1.每当有一个强连通分量i的入度为0,那么x++ 2.如果有一个强连通分量i,它的入度为0,且它连的每一条边只有他连,那么 ...