1. 程式人生 > >BZOJ 1303: [CQOI2009]中位數圖

BZOJ 1303: [CQOI2009]中位數圖

target 出現的次數 ios 一個 href 觀察 pan pri printf

二次聯通門 : BZOJ 1303: [CQOI2009]中位數圖

/*
    BZOJ 1303: [CQOI2009]中位數圖
    
    對於一個數
    若當前數大於中位數,則記為1
    小於中位數,記為-1,等於則記為0

    對原數列做一個前綴和

    觀察發現,若一段區間符合要求
    則該段區間內大於中位數的數的數量等於小於中位數的
    那麽統計一下每個前綴和出現的次數就好了
    
*/
#include <cstdio>
#include <iostream>

const int BUF = 12312313;
char
Buf[BUF], *buf = Buf; inline void read (int &now) { for (now = 0; !isdigit (*buf); ++ buf); for (; isdigit (*buf); now = now * 10 + *buf - 0, ++ buf); } #define Max 100002 int c[Max], s[Max]; short fc[Max], zc[Max]; int Main () { fread (buf, 1, BUF, stdin); int N, B; read (N), read (B); register
int i, j; int x, p = -1, Answer = 0; for (i = 1; i <= N; ++ i) { read (x); s[i] = s[i - 1]; if (x > B) ++ s[i]; else if (x < B) -- s[i]; else p = i; if (p == -1) s[i] < 0 ? ++ fc[- s[i]] : ++ zc[s[i]]; } for (++ zc[0]; p <= N; ++ p) Answer += s[p] < 0
? fc[- s[p]] : zc[s[p]]; printf ("%d", Answer); return 0; } int ZlycerQan = Main (); int main (int argc, char *argv[]) {;}

BZOJ 1303: [CQOI2009]中位數圖