---
# System prepended metadata

title: 'Codeforces Round #837 (Div. 2)解題心得'
tags: [CP]

---


###### tags: `CP`
# Codeforces Round #837 (Div. 2)解題心得
這次參加Codeforces Round #837 (Div. 2)，希望能夠將打Codeforces競賽成為習慣，以訓練DEBUG的能力和加快思考速度。

*A. Hossam and Combinatorics*
若a<sub>i</sub>,a<sub>j</sub>滿足|a<sub>i</sub>−a<sub>j</sub>|=max<sub>1≤p,q≤n</sub>|a<sub>p</sub>−a<sub>q</sub>|，則可以發現a<sub>i</sub>,a<sub>j</sub>是此數列的最大值和最小值，所以便利整個陣列，便可以得知此數列中與最大值和最小值相同的數共有幾個，因為算法設計，令r為最大值在數列中出現的次數，l為最小值在數列中出現的次數，若ma == mi時，其組合方式共有(l - 1) * r種；否則有l * r * 2種。
```
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
using ll = long long;

int main()
{
    int t, n; cin >> t;
    while(t--) {
        ll l = 0, r = 0;
        cin >> n;
        int mi = 1e6, ma = 0;
        vector <int> v(n);
        for(auto &i : v) {
            cin >> i;
            mi = min(mi, i);
            ma = max(ma, i);
        }

        for(auto i : v) {
            if(i == mi) l++;
            if(i == ma) r++;
        }
        if(ma == mi) cout << (l - 1) * r << "\n";
        else cout << l * r * 2 << "\n";
    }
}
```
*B. Hossam and Friends*
這題是在競賽結束之後才解出來，給定n個人，m組(x, y)，表示x, y之間相互不認識，問有多少組subsegment(a, b)(表示(a, b)間的人都相互認識)。解題思路意外簡單，若是未出現相互不認識的人則將值累加，否則將值更新為(x, y)之間的距離。

Example:
8
1 3
2 6

1 2 3 4 5 6 7 8
1 2 2 3 4 4 5 6

Ans = 1 + 2 + 2 + 3 + 4 + 4 + 5 + 6 = 27
```
#include <iostream>
#include <vector>

using namespace std;
using ll = long long;

int main()
{
    int t, n, m; cin >> t;
    while(t--) {
        cin >> n >> m;
        vector <int> v(n + 1, 0);
        while(m--) {
            int x, y; cin >> x >> y;
            if(x > y) swap(x, y);
            v[y] = max(v[y], x);
        }
        ll ans = 0;
        for(int i = 1; i <= n; ++i) {
            if(i != 1) v[i] = max(v[i - 1], v[i]);
            ans += i - v[i];
        }
        cout << ans << "\n";
    }
}
```