結果
| 問題 |
No.3201 Corporate Synergy
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-17 08:41:34 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 15,096 bytes |
| コンパイル時間 | 2,433 ms |
| コンパイル使用メモリ | 211,440 KB |
| 実行使用メモリ | 7,716 KB |
| 最終ジャッジ日時 | 2025-07-17 08:41:37 |
| 合計ジャッジ時間 | 3,472 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
#ifdef ONLINE_JUDGE
#include <bits/stdc++.h>
#include <atcoder/modint>
#elif defined(LOCAL)
#include <atcoder/pch.hpp>
#endif
// ――――――――――――――――――――――――――――――――
// abbreviation
// ――――――――――――――――――――――――――――――――
using namespace std;
using namespace atcoder;
using ll = long long;
template <typename T> using V = vector<T>;
template <typename T> using VV = vector<vector<T>>;
using vi = vector<int>;
using vl = vector<ll>;
using vd = V<double>;
using vs = V<string>;
using vc = V<char>;
using vvi = vector<vector<int>>;
using vvl = vector<vector<ll>>;
using vvc = vector<vector<char>>;
using si = set<int>;
using mi = multiset<int>;
template <typename T> using minpq = priority_queue<T, vector<T>, greater<T>>;
using mint = modint998244353;
using vm = V<mint>;
using vvm = VV<mint>;
template <int MOD> ostream& operator<<(ostream& os, const static_modint<MOD>& m) {
return os << m.val();
}
// ――――――――――――――――――――――――――――――――
// P
// ――――――――――――――――――――――――――――――――
template <typename T, typename U> struct P : pair<T, U> {
template <typename... Args> P(Args... args) : pair<T, U>(args...) {
}
using pair<T, U>::first;
using pair<T, U>::second;
P& operator+=(const P& r) {
first += r.first;
second += r.second;
return *this;
}
P& operator-=(const P& r) {
first -= r.first;
second -= r.second;
return *this;
}
P& operator*=(const P& r) {
first *= r.first;
second *= r.second;
return *this;
}
template <typename S> P& operator*=(const S& r) {
first *= r, second *= r;
return *this;
}
P operator+(const P& r) const {
return P(*this) += r;
}
P operator-(const P& r) const {
return P(*this) -= r;
}
P operator*(const P& r) const {
return P(*this) *= r;
}
template <typename S> P operator*(const S& r) const {
return P(*this) *= r;
}
P operator-() const {
return P{-first, -second};
}
};
using pl = P<ll, ll>;
using pi = P<int, int>;
using vp = V<pl>;
// ――――――――――――――――――――――――――――――――
// preprocessor
// ――――――――――――――――――――――――――――――――
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define call(v) (v).cbegin(), (v).cend()
#define each(i, v) for (auto i : (v))
#define each2(x, y, v) for (auto [x, y] : (v))
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define repr(i, n) for (ll i = (ll)(n) - 1; i >= 0; i--)
#define repit(i, v) for (auto i = v.begin(); i < v.end(); i++)
#define reprit(i, v) for (auto i = v.rbegin(); i < v.rend(); i++)
#define reg(i, l, r) for (ll i = (ll)(l); i < (ll)(r); i++)
#define regr(i, l, r) for (ll i = (ll)(r) - 1; i >= (ll)(l); i--)
#define regit(i, l, r) for (auto i = (l); i != (r); i++)
#define regrit(i, l, r) for (auto i = make_reverse_iterator((r)); i != make_reverse_iterator((l)); i++)
#define REP(i, n) for (ll i = 0; i <= (ll)(n); i++)
#define REPR(i, n) for (ll i = (ll)(n); i >= 0; i--)
#define REG(i, l, r) for (ll i = (ll)(l); i <= (ll)(r); i++)
#define REGR(i, l, r) for (ll i = (ll)(r); i >= (ll)(l); i--)
#define Yes cout << "Yes" << el
#define No cout << "No" << el
#define YES cout << "YES" << el
#define NO cout << "NO" << el
#define fls cout << flush
#define eps (1e-10)
#define Equals(a, b) (fabs((a) - (b)) < eps)
#define MAX(x) *max_element(all(x))
#define MIN(x) *min_element(all(x))
#define BIT(n) (1LL << (n))
#define between(l, k, r) (l <= k && k < r)
#define ints(...) \
int __VA_ARGS__; \
input(__VA_ARGS__)
#define pb push_back
// #define fi first
// #define se second
// ――――――――――――――――――――――――――――――――
// constexpr
// ――――――――――――――――――――――――――――――――
constexpr int INF = 0x3f3f3f3f;
constexpr ll LINF = 0x3f3f3f3f3f3f3f3fLL;
constexpr double EPS = 1e-8;
constexpr int MOD = 998244353;
// constexpr int MOD = 1000000007;
constexpr string_view ascii_lowercase = "abcdefghijklmnopqrstuvwxyz";
constexpr string_view ascii_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
constexpr char el = '\n';
constexpr char spa = ' ';
// ――――――――――――――――――――――――――――――――
// yn, YN
// ――――――――――――――――――――――――――――――――
bool yn(const bool b) {
if (b) {
Yes;
} else {
No;
}
return b;
}
bool YN(const bool b) {
if (b) {
YES;
} else {
NO;
}
return b;
}
// ――――――――――――――――――――――――――――――――
// chmax, chmin
// ――――――――――――――――――――――――――――――――
template <class T> bool chmax(T& a, const T& b) {
if (a < b) {
a = b;
return true;
}
return false;
}
template <class T> bool chmin(T& a, const T& b) {
if (a > b) {
a = b;
return true;
}
return false;
}
// ――――――――――――――――――――――――――――――――
// input
// ――――――――――――――――――――――――――――――――
template <typename T> void input(T& n) {
cin >> n;
}
template <typename T> void input(V<T>& v, const int n) {
T value;
for (int i = 0; i < n; ++i) {
input(value);
v.push_back(value);
}
}
template <typename T> void input(VV<T>& v, const int h, const int w) {
V<T> vec;
for (int i = 0; i < h; i++) {
vec.clear();
input(vec, w);
v.push_back(vec);
}
}
template <typename T, typename U> void input(P<T, U>& p) {
cin >> p.first >> p.second;
}
template <typename T, typename... Args> void input(T& first, Args&... args) {
input(first);
if constexpr (sizeof...(args) > 0) {
input(args...);
}
}
template <typename T> void input(set<T>& s, const int n) {
for (int i = 0; i < n; ++i) {
T value;
input(value);
s.insert(value);
}
}
template <typename T> void input(multiset<T>& s, const int n) {
for (int i = 0; i < n; ++i) {
T value;
input(value);
s.insert(value);
}
}
template <typename T> void input(unordered_set<T>& s, const int n) {
for (int i = 0; i < n; ++i) {
T value;
input(value);
s.insert(value);
}
}
template <typename K, typename T> void input(map<K, T>& m, const int n) {
for (int i = 0; i < n; ++i) {
K k;
T v;
input(k, v);
m.emplace(k, v);
}
}
template <typename K, typename T> void input(unordered_map<K, T>& m, const int n) {
for (int i = 0; i < n; ++i) {
K k;
T v;
input(k, v);
m.emplace(k, v);
}
}
// ――――――――――――――――――――――――――――――――
// print
// ――――――――――――――――――――――――――――――――
template <typename T> void print(const T& value, bool endline = true) {
cout << value;
if (endline) {
cout << el;
}
}
template <typename T> void print(const V<T>& vec, bool endline = true) {
for (size_t i = 0; i < vec.size(); ++i) {
print(vec[i], false);
if (i != vec.size() - 1) {
cout << spa;
}
}
if (endline) {
cout << el;
}
}
template <typename T, typename U> void print(const P<T, U>& p, bool endline = true) {
cout << p.first << spa << p.second;
if (endline) {
cout << el;
}
}
template <size_t Index = 0, typename... T> void print_tuple(const tuple<T...>& tpl) {
if constexpr (Index < sizeof...(T)) {
print(get<Index>(tpl), false);
if constexpr (Index < sizeof...(T) - 1) cout << spa;
print_tuple<Index + 1>(tpl);
}
}
template <typename... T> void print(const tuple<T...>& tpl, bool endline = true) {
print_tuple(tpl);
if (endline) cout << el;
}
template <typename T, typename... Args> void print(const T& first, Args&... args) {
print(first, false);
cout << spa;
if constexpr (sizeof...(args) > 0) {
print(args...);
}
}
template <typename Iterator,
typename = enable_if_t<
is_same_v<typename iterator_traits<Iterator>::iterator_category, input_iterator_tag> ||
is_same_v<typename iterator_traits<Iterator>::iterator_category, output_iterator_tag> ||
is_same_v<typename iterator_traits<Iterator>::iterator_category, forward_iterator_tag> ||
is_same_v<typename iterator_traits<Iterator>::iterator_category, bidirectional_iterator_tag> ||
is_same_v<typename iterator_traits<Iterator>::iterator_category, random_access_iterator_tag>>>
void print(Iterator begin, Iterator end, bool endline = true) {
for (Iterator it = begin; it != end; ++it) {
print(*it, false);
if (next(it) != end) {
cout << spa;
}
}
if (endline) {
cout << el;
}
}
// ――――――――――――――――――――――――――――――――
// debug
// ――――――――――――――――――――――――――――――――
template <typename T> void debug(const T& value, bool endline = true) {
if constexpr (is_same_v<T, int>) {
if (value >= INF) {
cerr << "inf";
} else if (value <= -INF) {
cerr << "-inf";
} else {
cerr << value;
}
} else if constexpr (is_same_v<T, ll>) {
if (value >= LINF) {
cerr << "inf";
} else if (value <= -LINF) {
cerr << "-inf";
} else {
cerr << value;
}
} else {
cerr << value;
}
if (endline) {
cerr << el;
}
}
template <typename T> void debug(const V<T>& vec, bool endline = true) {
for (size_t i = 0; i < vec.size(); ++i) {
debug(vec[i], false);
if (i != vec.size() - 1) {
cerr << spa;
}
}
if (endline) {
cerr << el;
}
}
template <typename T> void debug(const VV<T>& vec, bool endline = true) {
for (size_t i = 0; i < vec.size(); ++i) {
debug(vec[i], false);
if (i != vec.size() - 1) {
cerr << el;
}
}
if (endline) {
cerr << el;
}
}
template <typename T, typename U> void debug(const P<T, U>& p, bool endline = true) {
cerr << p.first << spa << p.second;
if (endline) {
cerr << el;
}
}
template <size_t Index = 0, typename... T> void debug_tuple(const tuple<T...>& tpl) {
if constexpr (Index < sizeof...(T)) {
debug(get<Index>(tpl), false);
if constexpr (Index < sizeof...(T) - 1) cerr << spa;
debug_tuple<Index + 1>(tpl);
}
}
template <typename... T> void debug(const tuple<T...>& tpl, bool endline = true) {
debug_tuple(tpl);
if (endline) cerr << el;
}
template <typename T, typename... Args> void debug(const T& first, Args&... args) {
debug(first, false);
cerr << spa;
if constexpr (sizeof...(args) > 0) {
debug(args...);
}
}
template <typename Iter> auto sum(Iter begin, Iter end) {
using T = typename iterator_traits<Iter>::value_type;
return accumulate(begin, end, T{});
}
template <typename Iterator,
typename = enable_if_t<
is_same_v<typename iterator_traits<Iterator>::iterator_category, input_iterator_tag> ||
is_same_v<typename iterator_traits<Iterator>::iterator_category, output_iterator_tag> ||
is_same_v<typename iterator_traits<Iterator>::iterator_category, forward_iterator_tag> ||
is_same_v<typename iterator_traits<Iterator>::iterator_category, bidirectional_iterator_tag> ||
is_same_v<typename iterator_traits<Iterator>::iterator_category, random_access_iterator_tag>>>
void debug(Iterator begin, Iterator end, bool endline = true) {
for (Iterator it = begin; it != end; ++it) {
debug(*it, false);
if (next(it) != end) {
cerr << spa;
}
}
if (endline) {
cerr << el;
}
}
// ――――――――――――――――――――――――――――――――
// mod_pow
// ――――――――――――――――――――――――――――――――
template <typename T> T mod_pow(T x, T n, const T& p) {
T ret = 1;
while (n > 0) {
if (n & 1) (ret *= x) %= p;
(x *= x) %= p;
n >>= 1;
}
return ret;
}
// ――――――――――――――――――――――――――――――――
// monoid
// ――――――――――――――――――――――――――――――――
using MS = int;
using MF = int;
MS op(MS l, MS r) {
return min(l, r);
}
MS e() {
return INF;
}
MS mapping(MF l, MS r) {
return r + l;
}
MF composition(MF l, MF r) {
return l + r;
}
MF id() {
return 0;
}
// ――――――――――――――――――――――――――――――――
// ACL
// ――――――――――――――――――――――――――――――――
// #include <atcoder/fenwicktree>
// #include <atcoder/segtree>
// #include <atcoder/lazysegtree>
// #include <atcoder/string>
// #include <atcoder/math>
// #include <atcoder/convolution>
// #include <atcoder/dsu>
#include <atcoder/maxflow>
// #include <atcoder/mincostflow>
// #include <atcoder/scc>
// #include <atcoder/twosat>
int main() {
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
cout << fixed << setprecision(10) << boolalpha;
cerr << fixed << setprecision(10) << boolalpha;
ints(N);
vl P;
input(P, N);
ints(M);
vl U, V;
rep(_, M) {
input(U, 1);
input(V, 1);
}
ints(K);
ll ans = 0;
each(p, P) if (p >= 0) ans += p;
mf_graph<ll> G(N + K + 2);
int S = N + K;
int T = S + 1;
rep(i, N) {
ll p = P[i];
if (p >= 0)
G.add_edge(i, T, p);
else
G.add_edge(S, i, -p);
}
rep(i, M) {
ll u = U[i] - 1;
ll v = V[i] - 1;
G.add_edge(u, v, LINF);
}
int a, b;
ll s;
rep(i, K) {
input(a, b, s);
--a;
--b;
ans += s;
G.add_edge(a, N + i, LINF);
G.add_edge(b, N + i, LINF);
G.add_edge(N + i, T, s);
}
ll F = G.flow(S, T);
ans -= F;
print(ans);
// debug(F);
// each(e, G.edges()) debug(e.from, e.to, e.cap, e.flow);
return 0;
}