Submission #1322243

#TimeUsernameProblemLanguageResultExecution timeMemory
1322243pobeCollecting Stamps 3 (JOI20_ho_t3)C++20
15 / 100
14 ms5688 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
void solve() {
    int n, l;
    cin >> n >> l;
    vector <int> x(n), t(n);
    for (int i = 0; i < n; ++i) {
        cin >> x[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> t[i];
    }
    int ans = 0;
    int inf = 2e18;
    vector <vector <vector <int>>> dp(2, vector <vector <int>> (n + 1, vector <int> (n + 1, 2e18)));
    vector <vector <vector <int>>> last = dp;
    last[0][0][0] = 0;
    int st = 0;
    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= n; ++j) {
            for (int f = 0; f + j < n; ++f) {
                if (last[0][j][f] != inf) {
                    if (j == 0) {
                        st = 0;
                    } else {
                        st = x[j - 1];
                    }
                    if (x[j] - st + last[0][j][f] <= t[j]) {
//                        cout << i << " " << j << " " << f << endl;
                        dp[0][j + 1][f] = min(dp[0][j + 1][f], x[j] - st + last[0][j][f]);
//                        cout << dp[0][j + 1][f] << endl;
                    }
                    int ind = n - 1 - f;
//                    cout << i << " " << j << " " << f << endl;
//                    cout << l << " " << x[ind] << " " << st << " " << last[0][j][f] << " " << t[ind] << endl;
                    if (l - x[ind] + st + last[0][j][f] <= t[ind]) {
                        dp[1][j][f + 1] = min(dp[1][j][f + 1], l - x[ind] + st + last[0][j][f]);
                    }
                }
                if (last[1][j][f] != inf) {
                    if (f == 0) {
                        st = l;
                    } else {
                        st = x[n - f];
                    }
                    if (last[1][j][f] + st - x[n - f - 1] <= t[n - f - 1]) {
//                        cout << i << " " << " " << j << " " << f << endl;
                        dp[1][j][f + 1] = min(dp[1][j][f + 1], last[1][j][f] + st - x[n - f - 1]);
                    }
                    if (last[1][j][f] + l - st + x[j] <= t[j]) {
//                        cout << i << " " << " " << j << " " << f << endl;
                        dp[0][j + 1][f] = min(dp[0][j + 1][f], last[1][j][f] + l - st + x[j]);
                    }
                }
            }
        }
        for (int j = 0; j <= n; ++j) {
            for (int f = 0; f + j < n; ++f) {
                if (f == 0) {
                    st = l;
                } else {
                    st = x[n - f];
                }
                dp[0][j + 1][f] = min(dp[0][j + 1][f], dp[1][j][f] + l - st + x[j]);
                dp[1][j][f + 1] = min(dp[1][j][f + 1], dp[1][j][f] + st - x[n - f - 1]);
                if (j == 0) {
                    st = 0;
                } else {
                    st = x[j - 1];
                }
                dp[1][j][f + 1] = min(dp[1][j][f + 1], l - x[n - f - 1] + st + dp[0][j][f]);
                dp[0][j + 1][f] = min(dp[0][j + 1][f], x[j] - st + dp[0][j][f]);
            }
        }
        bool flag = false;
        for (int j = 0; j <= n; ++j) {
            for (int f = 0; f + j <= n; ++f) {
                if (dp[0][j][f] < inf || dp[1][j][f] < inf) {
                    flag = true;
                }
                last[0][j][f] = inf;
                last[1][j][f] = inf;
            }
        }
        swap(last, dp);
        if (flag) {
            ans = i + 1;
        } else {
            break;
        }
    }
    cout << ans << '\n';
}
int add(int mask, int j) {
    return mask | (1LL << j);
}
void bad() {
    int n;
    cin >> n;
    vector <int> x(n), t(n);
    int l;
    cin >> l;
    int ans = 0;
    for (int i = 0; i < n; ++i) {
        cin >> x[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> t[i];
    }
    vector <vector <int>> dp((1LL << n), vector <int> (n + 1, 2e18));
    dp[0][n] = 0;
    for (int mask = 0; mask < (1LL << n); ++mask) {
        for (int j = 0; j < n; ++j) {
            if (dp[mask][j] != 2e18) {
                for (int i = 0; i < n; ++i) {
                    int d = abs(x[i] - x[j]);
                    d = min(d, l - d);
                    if (((mask >> i) & 1) == 0 && dp[mask][j] + d <= t[i]) {
                        dp[add(mask, i)][i] = min(dp[add(mask, i)][i], dp[mask][j] + d);
                    }
                }
                ans = max(ans, (int)__builtin_popcount(mask));
            }
        }
        if (dp[mask][n] != 2e18) {
            for (int i = 0; i < n; ++i) {
                int d = abs(x[i]);
                d = min(d, l - d);
                if (((mask >> i) & 1) == 0 && dp[mask][n] + d <= t[i]) {
                    dp[add(mask, i)][i] = min(dp[add(mask, i)][i], dp[mask][n] + d);
                }
            }
            ans = max(ans, (int)__builtin_popcount(mask));
        }
    }
    cout << ans << '\n';
}
signed main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    bad();
}
/*
4 19
3 7 12 14
2 0 5 4
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...