CQOI2009中位数
[CQOI2009] 中位数
题目描述
给出 $1,2,…,n$ 的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是 $b$。中位数是指把所有元素从小到大排列后,位于中间的数。
输入格式
第一行为两个正整数 $n$ 和 $b$,第二行为 $1,2,…,n$ 的排列。
输出格式
输出一个整数,即中位数为 $b$ 的连续子序列个数。
样例 #1
样例输入 #1
1 | 7 4 |
样例输出 #1
1 | 4 |
提示
数据规模与约定
对于 $30\%$ 的数据中,满足 $n \le 100$;
对于 $60\%$ 的数据中,满足 $n \le 1000$;
对于 $100\%$ 的数据中,满足 $n \le 100000,1 \le b \le n$。
AC代码
1 |
|
思路分析
主要思路把数据的大小转化为是否比b大,从而把数据转换为1/0/-1的形式,接着进行前缀和和后缀和的相加,顺便把数据存进map里,因为可能会出现负数。这样的话时间复杂度是O(nlogn)而不是O(n)了,可以把桶开大点,然后负数也可以存了,那么时间复杂度就是O(n)了,例如
1 | int p[2e5+100]//这里就可以把初始值设置成1e5 p[0]->p[1e5] p[-5]->p[1e5-5] |
错误总结
- 还是要记得数据范围别炸int哩!
- 第一第二次投了都没过,最后发现自己把循环变量和b的位置搞混了= =
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Xunyoyo!