CF Hello 2020 B New Year and Ascent Sequence
题意: 给你n个数组,两两之间进行有序拼接,要求判断拼接后的数组是否是上升的,判断条件是是否存在这样的整数对 1≤i<j≤l 并且ai<aj。
思路: 用两个数组分别记录下每个数组的最大值和最小值,然后把最大值进行排序。每次取每个数组中的最小值到所有数组中的最大值中找有多少个数比它大。有的特殊情况就是数组原本就满足,那么就讲最大值记录为无穷大,最小值记录为-1。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e7;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
int i, num, li, j;
cin >> n;
vector<int> v;
vector<int> maxx;
int num1, num2;
int cnt = 0;
for (i = 0; i < n; i++) {
cin >> li;
bool flag = false;
cin >> num;
num1 = num2 = num;
for (j = 1; j < li; j++) {
cin >> num;
if (num > num2)
flag = true;
num2 = min(num2, num);
num1 = max(num1, num);
}
if (flag) {
maxx.push_back(maxn);
v.push_back(-1);
}
else {
maxx.push_back(num1);
v.push_back(num2);
}
}
sort(maxx.begin(), maxx.end());
long long ans = 0;
for (i = 0; i < v.size(); i++) {
ans += (maxx.end() - upper_bound(maxx.begin(), maxx.end(), v[i]));
}
cout << ans << endl;
return 0;
}