zoukankan      html  css  js  c++  java
  • BZOJ1303: [CQOI2009]中位数图

    题目链接
    题意很直白了,在1~n的排列中寻找以b为中位数的序列个数。
    首先可以记下b的位置,因为是‘1~n的排列’,所以每个数只出现一次;
    而要求b是中位数,我们知道,在一个个数为奇数的数列中,成为中位数的条件就是比它大的数字个数=比他小的数字个数,我们又记下了b的位置,所以具体到左右,就是:
      b左边比他大的数字个数+b右边比他大的数字个数=b左边比他小的数字个数+b右边比它小的数字个数
    即:左大+右大=左小+右小
        左大-左小=右小-右大=-(右大-右小)
    明白了这点,我们可以维护一个类似于前缀和的数组来表示在b的左右比它大的数字个数
    再根据乘法原理,就可以出解
    【code】:
    var
      i,j,k,b,x,y,point,n:longint;
      a:array[0..100100]of longint;
      left,right:array[-100100..100100]of longint;
      ans:longint;
    begin
      readln(n,b);
      for i:=1 to n do begin
        read(a[i]);
        if a[i]=b then point:=i;
      end;
      x:=0;
      left[0]:=1;
      right[0]:=1;
      for i:=point-1 downto 1 do begin
        if a[i]>b then inc(x) else deC(x);
        inc(left[x]);
      end;
      x:=0;
      for i:=point+1 to n do begin
        if a[i]>b then inc(x) else dec(x);
        inc(right[x]);
      end;
      ans:=0;
      for i:=-n to n do
        ans:=ans+left[i]*right[-i];
      writeln(ans);
    end.
  • 相关阅读:
    [译] 第二十天:Stanford CoreNLP
    [译] 第十九天: Ember
    [译] 第十八天:BoilerPipe
    [译] 第十七天:JBoss Forge
    [译] 第十六天: Goose Extractor
    [译] 第十五天:Meteor
    [译] 第十四天:Standford NER
    [译] 第十三天:Dropwizard
    [译] 第十二天: OpenCV
    hadoop-MR
  • 原文地址:https://www.cnblogs.com/vincent-hwh/p/5990332.html
Copyright © 2011-2022 走看看