QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#386557 | #6406. Stage Clear | zlxFTH | ML | 1104ms | 330896kb | C++14 | 3.2kb | 2024-04-11 18:14:04 | 2024-04-11 18:14:04 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define debug(...) fprintf(stderr, __VA_ARGS__)
using i64 = long long;
int n, m;
void solve1() {
vector<i64> a(n), b(n);
for (int i = 1; i < n; ++i) {
cin >> a[i] >> b[i];
}
vector<int> from(1 << n);
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v, u--, v--;
from[v] |= 1 << u;
}
vector<i64> w(1 << n);
for (int s = 0; s < (1 << n); ++s) if (s & 1) {
for (int i = 0; i < n; ++i) {
if (s >> i & 1) {
w[s] += -a[i] + b[i];
}
}
}
vector<i64> f(1 << n, 1E18);
f[1] = 0;
for (int s = 2; s < (1 << n); ++s) if (s & 1) {
for (int i = 1; i < n; ++i) {
if (s >> i & 1 && from[i] & s) {
int t = s ^ (1 << i);
/*
f[t] + w[t] >= a[i] -> f[t] + w[t]
f[t] + w[t] < a[i] -> a[i] - w[t]
*/
if (f[t] + w[t] >= a[i]) f[s] = min(f[s], f[t]);
else f[s] = min(f[s], a[i] - w[t]);
}
}
}
cout << f[(1 << n) - 1] << "\n";
}
void solve2() {
vector<i64> a(n), b(n);
for (int i = 1; i < n; ++i) {
cin >> a[i] >> b[i];
}
vector<pair<int, int>> e(m);
vector<vector<int>> adj(n);
for (int i = 0; i < m; ++i) {
auto &[u, v] = e[i];
cin >> u >> v, u--, v--;
adj[u].push_back(i);
}
vector<int> used(m), vis(n);
auto dfs = [&](auto self, int u)->void {
vis[u] = 1;
for (auto i : adj[u]) {
int v = e[i].second;
if (!vis[v]) {
self(self, v);
used[i] = 1;
}
}
};
dfs(dfs, 0);
vector<int> c;
for (int i = 0; i < m; ++i) {
if (!used[i]) {
c.push_back(i);
}
}
int cnt = c.size();
vector<int> o(n);
iota(o.begin(), o.end(), 0);
sort(o.begin(), o.end(), [&](auto u, auto v) {
if ((a[u] < b[u]) != (a[v] < b[v])) {
return a[u] < b[u];
}
if (a[u] < b[u]) {
return a[u] < a[v];
} else {
return b[u] > b[v];
}
});
i64 ans = 1E18;
vector<vector<int>> adj_n(n);
vector<int> from(n);
auto rdfs = [&](auto self, int u, i64 &A, i64 &B)->void {
if (B >= a[u]) {
B += -a[u] + b[u];
} else {
A = a[u] - (-A + B);
B = b[u];
}
for (auto i : adj_n[u]) {
int v = e[i].second;
self(self, v, A, B);
}
};
for (int s = 0; s < (1 << cnt); ++s) {
fill(from.begin(), from.end(), -1);
for (int i = 0; i < n; ++i) {
vector<int>().swap(adj_n[i]);
}
for (int i = 0; i < cnt; ++i) {
if (s >> i & 1) {
auto [u, v] = e[c[i]];
if (from[v] == -1) {
from[v] = u;
}
}
}
for (int i = 0; i < m; ++i) {
if (used[i] == 1) {
auto [u, v] = e[i];
if (from[v] == -1) {
from[v] = u;
}
}
}
for (int i : o) {
if (i) {
assert(from[i] < i && from[i] != -1);
adj_n[from[i]].push_back(i);
}
}
i64 A = 0, B = 0;
rdfs(rdfs, 0, A, B);
ans = min(ans, A);
}
cout << ans << "\n";
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m;
if (n <= 26) {
solve1();
} else {
solve2();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3664kb
input:
4 4 4 2 5 3 2 6 1 2 1 3 2 4 3 4
output:
4
result:
ok 1 number(s): "4"
Test #2:
score: 0
Accepted
time: 2ms
memory: 3860kb
input:
15 14 254040392438309 117083115436273 500005748229691 557255157630172 821034233718230 865199673774998 659892147898798 987564141425694 81172575487567 811635577877255 751768357864605 341103322647288 454926350150218 140191090713900 921608121471585 659295670987251 223751724062143 505619245326640 8907765...
output:
1665396301509143
result:
ok 1 number(s): "1665396301509143"
Test #3:
score: 0
Accepted
time: 14ms
memory: 8360kb
input:
18 17 636830992776530 847574431876821 330869946457865 78274534165482 450581372553540 11565219334965 8736347226844 17186323694285 870805093198860 559070167736042 674369178493171 930151818400874 641605209598997 222521062460239 450936030349531 469197172169023 831295459816974 626096008793091 53095460351...
output:
2375957544280218
result:
ok 1 number(s): "2375957544280218"
Test #4:
score: 0
Accepted
time: 65ms
memory: 23888kb
input:
20 19 539893468691183 767805205447882 240338186903141 960937349402327 942645580569365 896509929612645 542601575005817 191461109090531 540992546866047 765080044816119 904535155855114 858111921213175 452499200048240 115895143306864 983856946412026 838504718536099 586421298181479 265212699386882 677124...
output:
800919806038419
result:
ok 1 number(s): "800919806038419"
Test #5:
score: 0
Accepted
time: 1104ms
memory: 330896kb
input:
24 23 114281007218527 308690671179962 145951034437731 718976086594208 709172151907814 926071954787084 224496444610281 498657753059525 874422017133378 857676356343078 532175866197017 818525693672607 303837639402605 374469705563954 512244364294540 952911486867703 748959419417502 249992707230361 512696...
output:
114281007218527
result:
ok 1 number(s): "114281007218527"
Test #6:
score: -100
Memory Limit Exceeded
input:
36 35 389328367777319 678636570542258 32216944647452 612585362150577 891592845704885 596030605892036 688825276167602 461516360471825 916552899998310 106733202183953 400050408958777 670724326933521 995792861502757 894514508573875 14511185222713 612305257166443 175168368096281 508263855969282 85578802...