Submission #3664591
Source Code Expand
#include <bits/stdc++.h>
#if MYDEBUG
#include "lib/cp_debug.hpp"
#else
#define DBG(...) ;
#endif
#if __cplusplus <= 201402L
template <typename T>
T gcd(T a, T b) { return ((a % b == 0) ? b : gcd(b, a % b)); }
template <typename T>
T lcm(T a, T b) { return a / gcd(a, b) * b; }
#endif
using LL = long long;
constexpr LL LINF = 334ll << 53;
constexpr int INF = 15 << 26;
constexpr LL MOD = 1E9 + 7;
namespace Problem {
using namespace std;
class Solver2 {
public:
int n, k;
vector<int> a, b, visit;
vector<vector<int>> to;
vector<vector<int>> memo;
vector<vector<int>> seq;
Solver2(LL n, LL k) : n(n), k(k), a(n), b(n), visit(n + 1), to(n + 1), memo(n + 1){};
void dfs(int a, int prev, int s, vector<int> &v) {
DBG(a, prev, s)
visit[a] = 1;
v.push_back(a);
int nxt = to[a][0];
if (nxt == prev) {
nxt = to[a][1];
}
if (nxt != s) {
dfs(nxt, a, s, v);
}
}
vector<int> dp(vector<int> &v) {
int m = v.size();
if (m == 2) {
return {0, abs(v[0] - v[1])};
}
vector<vector<vector<int>>> res(m + 1, vector<vector<int>>(2, vector<int>(2, INF)));
res[0][0][0] = 0;
res[1][1][1] = abs(v[0] - v[1]);
for (int i = 1; i < m - 1; ++i) {
for (int j = m - 1; j >= 0; --j) {
for (int k = 0; k < 2; ++k) {
res[j + 1][1][k] = min(res[j + 1][1][k], res[j][0][k] + abs(v[i] - v[i + 1]));
res[j][0][k] = min(res[j][0][k], res[j][1][k]);
}
}
}
DBG(res)
vector<int> ret(m + 1, INF);
ret[0] = 0;
for (int j = m; j >= 1; --j) {
ret[j] = min<int>({res[j][0][0], res[j][0][1], res[j][1][0], res[j][1][1], res[j - 1][0][0] + abs(v.back() - v[0])});
}
return ret;
}
vector<int> calc(vector<int> &a, vector<int> &&b) {
vector<int> ret(a.size() + b.size() - 1, INF);
for (int i = 0; i < a.size(); ++i) {
for (int j = 0; j < b.size(); ++j) {
ret[i + j] = min(ret[i + j], a[i] + b[j]);
}
}
return ret;
}
void solve() {
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
for (int i = 0; i < n; ++i) {
cin >> b[i];
}
int maxsum = 0;
set<int> S;
for (int i = 0; i < n; ++i) {
int ma = max(a[i], b[i]);
int mi = min(a[i], b[i]);
if (a[i] != b[i]) {
to[ma].push_back(mi);
to[mi].push_back(ma);
}
maxsum += ma;
S.insert(ma);
}
int rem = max(0, k - (int)S.size());
DBG(a, b, n, k)
DBG(maxsum, S, rem)
for (int i = n; i > 0; --i) {
if (visit[i] == 0 && to[i].size() == 2 && i > to[i][0] && i > to[i][1]) {
visit[i] = 1;
vector<int> tmp;
DBG(i)
tmp.push_back(i);
dfs(to[i][0], i, i, tmp);
seq.push_back(tmp);
}
}
DBG(seq)
vector<int> ans(1);
for (auto &&x : seq) {
vector<int> y;
int X = x.size();
for (int i = 0; i < X; ++i) {
if ((x[i] - x[(i - 1 + X) % X]) * (x[i] - x[(i + 1 + X) % X]) > 0) y.push_back(x[i]);
}
ans = calc(ans, dp(y));
}
DBG(ans)
cout << maxsum - *min_element(ans.begin() + rem, ans.end()) << endl;
}
};
} // namespace Problem
int main() {
std::cin.tie(0);
std::ios_base::sync_with_stdio(false);
// std::cout << std::fixed << std::setprecision(12);
long long n = 0, k;
std::cin >> n >> k;
Problem::Solver2 sol(n, k);
sol.solve();
return 0;
}
Submission Info
Submission Time |
|
Task |
G - Sum of Cards |
User |
Hoi_koro |
Language |
C++14 (GCC 5.4.1) |
Score |
500 |
Code Size |
3529 Byte |
Status |
AC |
Exec Time |
95 ms |
Memory |
1408 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
500 / 500 |
Status |
|
|
Set Name |
Test Cases |
Sample |
s1.txt, s2.txt, s3.txt |
All |
01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, 37.txt, 38.txt, 39.txt, 40.txt, s1.txt, s2.txt, s3.txt |
Case Name |
Status |
Exec Time |
Memory |
01.txt |
AC |
1 ms |
256 KB |
02.txt |
AC |
1 ms |
256 KB |
03.txt |
AC |
1 ms |
256 KB |
04.txt |
AC |
1 ms |
256 KB |
05.txt |
AC |
1 ms |
256 KB |
06.txt |
AC |
1 ms |
256 KB |
07.txt |
AC |
1 ms |
384 KB |
08.txt |
AC |
1 ms |
256 KB |
09.txt |
AC |
1 ms |
256 KB |
10.txt |
AC |
1 ms |
256 KB |
11.txt |
AC |
1 ms |
256 KB |
12.txt |
AC |
1 ms |
256 KB |
13.txt |
AC |
1 ms |
384 KB |
14.txt |
AC |
1 ms |
256 KB |
15.txt |
AC |
1 ms |
256 KB |
16.txt |
AC |
67 ms |
1280 KB |
17.txt |
AC |
25 ms |
1024 KB |
18.txt |
AC |
41 ms |
1152 KB |
19.txt |
AC |
48 ms |
1152 KB |
20.txt |
AC |
29 ms |
1128 KB |
21.txt |
AC |
52 ms |
1280 KB |
22.txt |
AC |
73 ms |
1280 KB |
23.txt |
AC |
95 ms |
1408 KB |
24.txt |
AC |
28 ms |
1024 KB |
25.txt |
AC |
68 ms |
1280 KB |
26.txt |
AC |
78 ms |
1408 KB |
27.txt |
AC |
28 ms |
1152 KB |
28.txt |
AC |
20 ms |
1024 KB |
29.txt |
AC |
78 ms |
1408 KB |
30.txt |
AC |
84 ms |
1408 KB |
31.txt |
AC |
9 ms |
896 KB |
32.txt |
AC |
10 ms |
896 KB |
33.txt |
AC |
11 ms |
896 KB |
34.txt |
AC |
9 ms |
768 KB |
35.txt |
AC |
11 ms |
896 KB |
36.txt |
AC |
42 ms |
1224 KB |
37.txt |
AC |
51 ms |
1152 KB |
38.txt |
AC |
26 ms |
1024 KB |
39.txt |
AC |
33 ms |
1152 KB |
40.txt |
AC |
43 ms |
1280 KB |
s1.txt |
AC |
1 ms |
256 KB |
s2.txt |
AC |
1 ms |
256 KB |
s3.txt |
AC |
1 ms |
256 KB |