BZOJ 1303: [CQOI2009]中位數圖
阿新 • • 發佈:2017-09-07
target 出現的次數 ios 一個 href 觀察 pan pri printf
二次聯通門 : BZOJ 1303: [CQOI2009]中位數圖
/* BZOJ 1303: [CQOI2009]中位數圖 對於一個數 若當前數大於中位數,則記為1 小於中位數,記為-1,等於則記為0 對原數列做一個前綴和 觀察發現,若一段區間符合要求 則該段區間內大於中位數的數的數量等於小於中位數的 那麽統計一下每個前綴和出現的次數就好了 */ #include <cstdio> #include <iostream> const int BUF = 12312313; charBuf[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); registerint 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]中位數圖