BZOJ 1303: [CQOI2009]中位数图 4000
2018-04-01 21:34
453 查看
1303: [CQOI2009]中位数图
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3297 Solved: 2033
[Submit][Status][Discuss]
Description
给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。Input
第一行为两个正整数n和b ,第二行为1~n 的排列。Output
输出一个整数,即中位数为b的连续子序列个数。Sample Input
7 45 7 2 4 3 1 6
Sample Output
4HINT
第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}N<=100000
Source
【思路】
前缀和问题, 连续子序列, 中位数, 瞬间降低了难度, 大于 赋值为1 小于 赋值为-1 等于赋值为 0又Sum[r]=Sum[l-1] ans++;
处理 有可能会有小于0 的情况 故 加 个n
【代码】
/*
* Date: 4/1/2018
* Tile: 1303
* AU: SIZ
* Cate: 思维,前缀和
* WA:3
*/
#include <iostream>
#include <bits/stdc++.h>
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;
using namespace std;
int a[MAXN];
int sum[MAXN];
map<int,int>mp;
int main()
{
mp.clear();
int n;
int b;
memset(sum,0,sizeof(sum));
cin>>n>>b;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int p=-1;
for(int i=1;i<=n;i++)
{
if(a[i]==b)
a[i]=0,p=i;
else
a[i]=(a[i]>b?1:-1);
sum[i]=sum[i-1]+a[i];
if(p==-1)
mp[sum[i]+n]++;
}
mp
++;
int ans=0;
for(int i=p;i<=n;i++)
{
// cout<<sum[i]<<" "<<mp[sum[i]+n]<<endl;
ans+=mp[sum[i]+n];
}
cout<<ans<<endl;
return 0;
}
123
相关文章推荐
- 【bzoj1303】[CQOI2009]中位数图
- [bzoj1303][CQOI2009]中位数图
- 子串为中位数的有几个——BZOJ 1303: [CQOI2009]中位数图
- BZOJ1303 [CQOI2009]中位数图
- BZOJ 1303 [CQOI2009] 中位数图 题解与分析
- BZOJ 1303: [CQOI2009]中位数图 【水题】
- bzoj1303: [CQOI2009]中位数图
- 【BZOJ】1303: [CQOI2009]中位数图(特殊的技巧)
- BZOJ 1303: [CQOI2009]中位数图( )
- BZOJ1303[CQOI2009]中位数图
- 【BZOJ 1303】 [CQOI2009]中位数图
- bzoj1303 cqoi2009 中位数
- bzoj 1303: [CQOI2009]中位数图 (乱搞)
- BZOJ1303: [CQOI2009]中位数图
- bzoj 1303: [CQOI2009]中位数图
- bzoj 1303 [CQOI2009]中位数图
- BZOJ1303 [CQOI2009]中位数图 【乱搞】
- bzoj 1303: [CQOI2009]中位数图
- bzoj1303: [CQOI2009]中位数图
- bzoj1303: [CQOI2009]中位数图