Vijos 1549题:中位数
来源:互联网 发布:人人商城v2 数据字典 编辑:程序博客网 时间:2024/06/13 16:12
描述
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。
格式
输入格式
第一行为两个正整数n和b ,第二行为1~n 的排列。
输出格式
输出一个整数,即中位数为b的连续子序列个数。
样例1
样例输入1
5 4
1 2 3 4 5
样例输出1
2
样例2
样例输入2
6 3
1 2 4 5 6 3
样例输出2
1
样例3
样例输入3
7 4
5 7 2 4 3 1 6
样例输出3
4
限制
各个测试点1s
提示
第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}。
对于40%的数据,n<=300;
对于80%的数据,n<=25000;
对于全部的数据,n<=100000。
来源
NOI2009重庆市代表队选拔赛第一题
#include<cstring>#include<cstdio>using namespace std;const int MAXN = 100000 + 10;long int num[MAXN], f[MAXN], sum[MAXN][2];int main(){ int n, a, b, bri, ans = 0; scanf("%d%d", &n, &b); for (int i = 1; i <= n; i++) { scanf("%d", &num[i]); if (num[i] < b) f[i] = f[i - 1] - 1; else if (num[i] > b) f[i] = f[i - 1] + 1; else if (num[i] == b) { bri = i; f[i] = f[i - 1]; } } for (int i = bri - 1; i >= 0; i--) { a = f[bri] - f[i]; if (a < 0) sum[-a][0]++; else if (a > 0) sum[a][1]++; else sum[0][0]++; } for (int j = bri; j <= n; j++) { a = f[j] - f[bri - 1]; if (a > 0) ans += sum[a][0]; else if (a < 0) ans += sum[-a][1]; else ans += sum[0][0]; } printf("%d", ans); return 0;}
0 0
- Vijos 1549题:中位数
- Vijos 1691-输油管道问题【中位数】
- Vijos P1549 中位数(CQOI2009)题解
- Vijos P1691 输油管道问题【中位数+排序】
- 排序+中位数 Vijos P2871 安装服务器
- Vijos 1034题:家族
- Vijos 1104题:采药
- Vijos 1166题:木牛流马
- Vijos 1193题:扫雷
- Vijos 1217题:乒乓球
- Vijos 1359题:Superprime
- Vijos 1773题:质因数
- Vijos 1002题:过河
- Vijos 3764 牛奶题
- splay入门题---中位数
- 中位数
- 中位数
- 中位数
- int、long、longlong、double范围
- vi/vim多行注释和取消注释
- Cas(09)——Cas Proxy原理,通过Cas Proxy访问其它Cas应用
- 封装的简单支付 微信支付宝
- 深入Spring:自定义注解加载和使用
- Vijos 1549题:中位数
- Opencv2.4.9源码分析——HoughLinesP
- DataBinding使用进阶
- 换部门与看录像——北漂18年(90)
- TabContainerView一一实现底部导航栏效果
- 设置bootstrap modal模态框的宽度和宽度
- Java继承_基类Object(三)
- 2.ehcache memcache redis 三大缓存男高音
- Lists是google对java.util.List类的封装