copy的题解是这篇https://www.luogu.com.cn/blog/FrozaFerrari/solution-cf1487e
#include <bits/stdc++.h> // By Lucky Ox
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define int long long
#define double long double
#define __int128 i128
#define endl '\n'
#define pii pair<int, int>
#define INF 0x3f3f3f3f3f3f3f3f
#define npos string::npos
#define mod 1000000000000002493
int lcm(int x, int y){return x * y / __gcd(x, y);}
int qmi(int a, int k, int p){int res = 1;while(k){if(k & 1) res = res * a % p;k >>= 1;a = a * a % p;}return res;}
//__builtin_popcount()返回括号内数的二进制表示形式中1的个数; __builtin_ctz();返回括号内数的二进制表示形式中末尾0的个数;
int n[5];
vector<int> v[5];
map<pii, bool> mp[5];
signed main() {
IOS;
for(int i = 1; i <= 4; i ++ ) cin >> n[i];
for(int i = 1; i <= 4; i ++ )
for(int j = 1; j <= n[i]; j ++ ) {
int x;
cin >> x;
v[i].push_back(x);
}
for(int i = 2; i <= 4; i ++ ) {
int m;
cin >> m;
for(int j = 1; j <= m; j ++ ) {
int x, y;
cin >> x >> y;
mp[i][{x, y}] = 1;
}
}
for(int i = 2; i <= 4; i ++ ) {
sort(v[i - 1].begin(), v[i - 1].end());
for(int j = 0; j < n[i]; j ++ ) {
int k = 0;
while(k < n[i - 1] && mp[i][{k + 1, j + 1}]) k ++ ;
if(k == n[i - 1])
v[i][j] = 1 << 30;
else
v[i][j] += v[i - 1][k];
}
}
sort(v[4].begin(), v[4].end());
cout << (v[4][0] > 1e9 ? -1 : v[4][0]) << endl;
return 0;
}
代码如上