###### 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";
}
}
```