1. 程式人生 > >考試模擬1 BestCoder Round #3 BestCoder Sequence

考試模擬1 BestCoder Round #3 BestCoder Sequence

這個題目的難點,就是如何對應一個數兩邊的數一個大一個小,想了很久想來想去,自己也不知道怎麼解決,想到邊遍歷邊記錄個數,可能要判斷奇數偶數之類的,看了網上的題解,只是覺得不能再巧妙,程式碼很好理解,可是方法也好體會,可是這種巧妙很難運用= =!!

參考其他部落格

#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
using namespace std;  
#define repf(i,a,b) for(int i=(a);i<=(b);i++)  
  
typedef long long ll;  
  
const int N = 4e4+10;  
  
int a[N], rec[N<<1];  
int n, m, pos, cnt;  
ll ans;  
  
int main() {  
    while (~scanf("%d%d", &n, &m)) {  
        memset(rec, 0, sizeof(rec));  
        repf (i, 0, n - 1) {  
            scanf("%d", &a[i]);  
            if (a[i] == m) {  
                pos = i;  
            }  
        }  
        cnt = 0;  
        for (int i = pos; i >= 0; i--) {  
            if (a[i] > m) cnt++;  
            if (a[i] < m) cnt--;  
            rec[N + cnt]++;  
        }  
        cnt = 0;  
        ans = 0;  
        for (int i = pos; i < n; i++) {  
            if (a[i] > m) cnt++;  
            if (a[i] < m) cnt--;  
            ans += rec[N - cnt];  
        }  
        cout << ans << endl;  
    }  
    return 0;  
}  


順便說下1001,最大流問題,大概是個模板題吧,怪不得我連題意都沒看懂,通過率還這麼高,嗯,就這樣吧!