Submission #1159865

#TimeUsernameProblemLanguageResultExecution timeMemory
1159865HakunaSemiexpress (JOI17_semiexpress)C++20
0 / 100
1094 ms24136 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 5;
long long n, m, k, a, b, c, t;
vector<bool> used(N);

vector< pair<int, int> > g[N];

int solve(int pos, int K) {
    if (K == 0) {
        vector<long long> d(n + 1, 1e18);
        d[1] = 0;
        set< pair<long long, int> > q;
        q.emplace(0, 1);
        while (!q.empty()) {
            auto [mn, v] = *q.begin();
            q.erase(q.begin());
            
            for (auto [to, w] : g[v]) {
                if (d[to] > mn + w) {
                    q.erase({d[to], to});
                    d[to] = mn + w;
                    q.emplace(d[to], to);
                }
            }
        }
        int ans = 0;
        for (int i = 2; i <= n; i++) {
            if (d[i] <= t) ans++;
        }
        return ans;
    }
    if (pos > n) return 0;
    // cerr << pos << ' ' << K << '\n';
    
    int ans = 0;
    for (int i = pos; i <= n; i++) {
        if (used[i]) continue;
        used[i] = 1;
        for (int j = 1; j <= n; j++) {
            if (i == j || !used[j]) continue;
            if (j < i) g[j].push_back({i, c * (i - j)});
            if (j > i) g[i].push_back({j, c * (j - i)});
        }
        
        ans = max(ans, solve(pos + 1, K - 1));
        
        for (int j = 1; j <= n; j++) {
            if (i == j || !used[j]) continue;
            if (j < i) g[j].pop_back();
            if (j > i) g[i].pop_back();
        }
        used[i] = 0;
    }
    return ans;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> m >> k >> a >> b >> c >> t;
    
    for (int i = 1; i < n; i++) {
        g[i].push_back({i + 1, a});
    }
    
    int s[m + 1];
    for (int i = 1; i <= m; i++) {
        cin >> s[i];
        for (int j = 1; j < i; j++) {
            int dif = s[i] - s[j];
            g[s[j]].push_back({s[i], dif * b});
            g[s[j]].push_back({s[i], dif * c});
        }
        used[s[i]] = 1;
    } k -= m;
    
    cout << solve(1, k);

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...