Submission #3665432
Source Code Expand
#include<bits/stdc++.h> using namespace std; using int64 = long long; const int64 INF = 1LL << 40; struct UnionFind { vector< int > data; UnionFind(int sz) { data.assign(sz, -1); } bool unite(int x, int y) { x = find(x), y = find(y); if(x == y) return (false); if(data[x] > data[y]) swap(x, y); data[x] += data[y]; data[y] = x; return (true); } int find(int k) { if(data[k] < 0) return (k); return (data[k] = find(data[k])); } int size(int k) { return (-data[find(k)]); } }; int64 dp5[5001][5001][2][2]; int D[5000]; bool v[5001]; int main() { int K, N, A[5000], B[5000]; cin >> N >> K; for(int i = 0; i < N; i++) cin >> A[i]; for(int i = 0; i < N; i++) cin >> B[i]; vector< int > ord(N); iota(begin(ord), end(ord), 0); sort(begin(ord), end(ord), [&](int a, int b) { return A[a] < A[b]; }); memset(dp5, -1, sizeof(dp5)); UnionFind uf(N); for(int i = 0; i < N; i++) { D[i] = B[ord[i]]; --D[i]; uf.unite(D[i], i); } int sz = 0; vector< int64 > dp(sz + 1, -INF); dp[0] = 0; for(int i = 0; i < N; i++) { if(v[i]) continue; v[i] = true; dp5[D[i]][1][0][1] = i + 1; dp5[D[i]][1][1][0] = D[i] + 1; int idx = D[i], szsz = 1; while(idx != i) { v[idx] = true; int nxt = D[idx]; for(int j = 0; j <= szsz; j++) { for(int k = 0; k < 2; k++) { for(int l = 0; l < 2; l++) { if(dp5[idx][j][k][l] == -1) continue; if(nxt == i) { // 最後の頂点 if(l) { // 最後の頂点はカウント済み if(k) { // この頂点はカウント済み dp5[nxt][j][true][l] = max(dp5[nxt][j][true][l], dp5[idx][j][k][l] + (nxt + 1)); dp5[nxt][j][false][l] = max(dp5[nxt][j][false][l], dp5[idx][j][k][l] + (idx + 1)); } else { // この頂点は未カウント dp5[nxt][j][true][l] = max(dp5[nxt][j][true][l], dp5[idx][j][k][l] + (nxt + 1)); dp5[nxt][j + 1][false][l] = max(dp5[nxt][j + 1][false][l], dp5[idx][j][k][l] + (idx + 1)); } } else { // 最後の頂点は未カウント if(k) { //ここに入る この頂点はカウント済み dp5[nxt][j + 1][true][l] = max(dp5[nxt][j + 1][true][l], dp5[idx][j][k][l] + (nxt + 1)); dp5[nxt][j][false][l] = max(dp5[nxt][j][false][l], dp5[idx][j][k][l] + (idx + 1)); } else { dp5[nxt][j + 1][true][l] = max(dp5[nxt][j + 1][true][l], dp5[idx][j][k][l] + (nxt + 1)); dp5[nxt][j + 1][false][l] = max(dp5[nxt][j + 1][false][l], dp5[idx][j][k][l] + (idx + 1)); } } } else if(k) { // この頂点は既にカウント済み dp5[nxt][j + 1][true][l] = max(dp5[nxt][j + 1][true][l], dp5[idx][j][k][l] + (nxt + 1)); dp5[nxt][j][false][l] = max(dp5[nxt][j][false][l], dp5[idx][j][k][l] + (idx + 1)); } else { // この頂点は未カウント dp5[nxt][j + 1][true][l] = max(dp5[nxt][j + 1][true][l], dp5[idx][j][k][l] + (nxt + 1)); dp5[nxt][j + 1][false][l] = max(dp5[nxt][j + 1][false][l], dp5[idx][j][k][l] + (idx + 1)); } } } } idx = D[idx]; ++szsz; } vector< int64 > dp2(uf.size(i) + 1, -INF); for(int j = 0; j <= uf.size(i); j++) { for(int k = 0; k < 2; k++) { for(int l = 0; l < 2; l++) { if(dp5[i][j][k][l] == -1) continue; dp2[j] = max(dp2[j], dp5[i][j][k][l]); } } } vector< int64 > dp3(sz + uf.size(i) + 1, -INF); for(int j = 0; j <= sz; j++) { for(int k = uf.size(i); k >= 0; k--) { dp3[j + k] = max(dp3[j + k], dp[j] + dp2[k]); } } sz += uf.size(i); // うくちゃんか? dp.swap(dp3); } int64 uku = 0; for(int i = K; i < dp.size(); i++) { uku = max(uku, dp[i]); } cout << uku << endl; }
Submission Info
Submission Time | |
---|---|
Task | G - Sum of Cards |
User | ei13333 |
Language | C++14 (GCC 5.4.1) |
Score | 500 |
Code Size | 4182 Byte |
Status | AC |
Exec Time | 303 ms |
Memory | 782080 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 | 191 ms | 781824 KB |
02.txt | AC | 191 ms | 781824 KB |
03.txt | AC | 191 ms | 781824 KB |
04.txt | AC | 191 ms | 781824 KB |
05.txt | AC | 191 ms | 781824 KB |
06.txt | AC | 191 ms | 781824 KB |
07.txt | AC | 192 ms | 781824 KB |
08.txt | AC | 192 ms | 781824 KB |
09.txt | AC | 191 ms | 781824 KB |
10.txt | AC | 192 ms | 781824 KB |
11.txt | AC | 192 ms | 781824 KB |
12.txt | AC | 192 ms | 781824 KB |
13.txt | AC | 192 ms | 781952 KB |
14.txt | AC | 192 ms | 781824 KB |
15.txt | AC | 192 ms | 781824 KB |
16.txt | AC | 267 ms | 781952 KB |
17.txt | AC | 230 ms | 781952 KB |
18.txt | AC | 248 ms | 781952 KB |
19.txt | AC | 251 ms | 781952 KB |
20.txt | AC | 241 ms | 782080 KB |
21.txt | AC | 257 ms | 781952 KB |
22.txt | AC | 278 ms | 781952 KB |
23.txt | AC | 303 ms | 782080 KB |
24.txt | AC | 237 ms | 781952 KB |
25.txt | AC | 274 ms | 781952 KB |
26.txt | AC | 286 ms | 781952 KB |
27.txt | AC | 236 ms | 781952 KB |
28.txt | AC | 225 ms | 781952 KB |
29.txt | AC | 286 ms | 781952 KB |
30.txt | AC | 286 ms | 781952 KB |
31.txt | AC | 215 ms | 782080 KB |
32.txt | AC | 218 ms | 782080 KB |
33.txt | AC | 220 ms | 782080 KB |
34.txt | AC | 212 ms | 782080 KB |
35.txt | AC | 221 ms | 782080 KB |
36.txt | AC | 253 ms | 782080 KB |
37.txt | AC | 252 ms | 781952 KB |
38.txt | AC | 232 ms | 781952 KB |
39.txt | AC | 239 ms | 781952 KB |
40.txt | AC | 252 ms | 782080 KB |
s1.txt | AC | 191 ms | 781824 KB |
s2.txt | AC | 191 ms | 781824 KB |
s3.txt | AC | 191 ms | 781824 KB |