NC19913 [CQOI2009]中位数图


题目

  • 原题地址:中位数图
  • 题目编号:NC19913
  • 题目类型:差分、前缀和
  • 时间限制:C/C++ 1秒,其他语言2秒
  • 空间限制:C/C++ 262144K,其他语言524288K

1.题目大意

  • 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。

2.题目分析

  • 比b大的设为1,比b小的设为-1;
  • 找到b的位置,分别向左向右计算sum;
  • 先算左面每个sum的个数,把sum为0的先加上(b本身一个元素也符合题意)
  • 在计算右面的sum时把可以与左面匹配(sum值互补)的个数加到答案里。

3.题目代码

#include 

using namespace std;

int a[100005];
int c[200005];
int f[100005];
int ans;

int main() {
    int n, b;
    cin >> n >> b;
    int pos, sum = 0;
    int ans = 0;
    for(int i=0;i> a[i];
        if(a[i]==b)
            pos = i;
        else
            f[i] = a[i]=0;i--)
    {
        sum += f[i];
        c[n-sum]++;
    }
    c[n]++;
    ans += c[n];
    sum = 0;
    for(int i=pos+1;i