hdu 4908 BestCoder Sequence(計數),hdu4908

來源:互聯網
上載者:User

hdu 4908 BestCoder Sequence(計數),hdu4908

題目連結:hdu 4908 BestCoder Sequence

題目大意:給定N和M,N為序列的長度,由1~N組成,求有多少連續的子序列以M為中位元,長度為奇數。

解題思路:v[i]記錄的是從1~i這些位置上有多少個數大於M,i-v[i]就是小於M的個數。pos為M在序列中的位置。如果有等式i−j=2∗(v[i]−v[j−1]),i≥pos≥j

那麼i和j既是一組滿足的情況。將等式變形i−2∗v[i]=j−2∗v[j−1].

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 40000;int N, M, pos, v[maxn+5], c[2][maxn*2+5];void init () {    int a;    v[0] = 0;    for (int i = 1; i <= N; i++) {        v[i] = v[i-1];        scanf("%d", &a);        if (a > M)            v[i]++;        if (a == M)            pos = i;    }}int solve () {    memset(c, 0, sizeof(c));    for (int i = 1; i <= pos; i++) {        int tmp = i - 2 * v[i-1];        c[0][tmp + maxn]++;    }    for (int i = pos; i <= N; i++) {        int tmp = i - 2 * v[i];        c[1][tmp + maxn]++;    }    int ans = 0;    for (int i = 0; i <= maxn*2; i++)        ans += c[0][i] * c[1][i];    return ans;}int main () {    while (scanf("%d%d", &N, &M) == 2) {        init();        printf("%d\n", solve());    }    return 0;}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.