BZOJ 1303: [CQOI2009]中位数图
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 4
5 7 2 4 3 1 6
5 7 2 4 3 1 6
Sample Output
4
HINT
第三个样例解释:{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[n]++; 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
岂曰无衣?与子同袍。王于兴师,修我戈矛。与子同仇!
岂曰无衣?与子同泽。王于兴师,修我矛戟。与子偕作!
岂曰无衣?与子同裳。王于兴师,修我甲兵。与子偕行!