考试模拟1 BestCoder Round #3 BestCoder Sequence

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xj13821328013/article/details/77775599

这个题目的难点,就是如何对应一个数两边的数一个大一个小,想了很久想来想去,自己也不知道怎么解决,想到边遍历边记录个数,可能要判断奇数偶数之类的,看了网上的题解,只是觉得不能再巧妙,代码很好理解,可是方法也好体会,可是这种巧妙很难运用= =!!

参考其他博客

#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,最大流问题,大概是个模板题吧,怪不得我连题意都没看懂,通过率还这么高,嗯,就这样吧!

猜你喜欢

转载自blog.csdn.net/xj13821328013/article/details/77775599