QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#542713#8936. Team Arrangementucup-team2000#WA 0ms4060kbC++231.8kb2024-09-01 04:25:262024-09-01 04:25:26

Judging History

This is the latest submission verdict.

  • [2024-09-01 04:25:26]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 4060kb
  • [2024-09-01 04:25:26]
  • Submitted

answer

#include <bits/stdc++.h>

const long long INF = 1E18;
int N;
std::pair<int, int> r[100];
int W[100];
std::map<std::pair<long long, int>, long long> dp;
std::set<std::pair<int, int>> available;
int pointer = 0;

long long search(long long flag, int hint) {
    if (hint == 0) return 0;
    auto it = dp.find({flag, hint});
    if (it != dp.end()) return it -> second;
    dp[{flag, hint}] = -INF;
    int op = pointer;
    while (pointer < N && r[pointer].second == hint) {
        available.insert({-r[pointer].first, pointer});
        ++pointer;
    }
    if (available.size() >= hint) {
        auto itt = available.begin();
        std::vector<int> storage;
        long long mod = 0;
        for (int i = 0; i < hint; ++i) {
            storage.push_back(itt -> second);
            mod ^= (1ll << itt -> second);
            auto nitt = itt;
            ++nitt;
            available.erase(itt);
            itt = nitt;
        }
        long long kk = search(flag ^ mod, hint);
        if (kk > -INF) dp[{flag, hint}] = std::max(dp[{flag, hint}], kk + W[hint]);
        for (int i = 0; i < hint; ++i) {
            available.insert({-r[storage[i]].first, storage[i]});
        }
    }
    if (available.empty() || -available.begin() -> first < hint) {
        dp[{flag, hint}] = std::max(dp[{flag, hint}], search(flag, hint - 1));
    }
    pointer = op;
    // printf("%lld %d %lld\n", flag, hint, dp[{flag, hint}]);
    return dp[{flag, hint}];
}

int main() {
    scanf("%d", &N);
    for (int i = 0; i < N; ++i) {
        scanf("%d%d", &r[i].first, &r[i].second);
    }
    for (int i = 1; i <= N; ++i) {
        scanf("%d", &W[i]);
    }
    std::sort(r, r + N, [&](auto &a, auto &b) { 
        return a.second > b.second;
    });
    long long ans = search(0, N);
    if (ans == -INF) {
        puts("impossible");
        return 0;
    }
    printf("%lld\n", ans);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3796kb

input:

3
2 3
1 2
2 2
4 5 100

output:

9

result:

ok single line: '9'

Test #2:

score: 0
Accepted
time: 0ms
memory: 3856kb

input:

3
1 3
3 3
2 3
1 1 100

output:

100

result:

ok single line: '100'

Test #3:

score: 0
Accepted
time: 0ms
memory: 3944kb

input:

2
1 1
2 2
1 1

output:

impossible

result:

ok single line: 'impossible'

Test #4:

score: 0
Accepted
time: 0ms
memory: 3728kb

input:

3
2 3
1 2
2 2
-100 -200 100000

output:

-300

result:

ok single line: '-300'

Test #5:

score: 0
Accepted
time: 0ms
memory: 3792kb

input:

9
1 4
2 5
3 4
1 5
1 1
2 5
3 5
1 3
1 1
1 1 1 1 1 1 1 1 1

output:

6

result:

ok single line: '6'

Test #6:

score: 0
Accepted
time: 0ms
memory: 4052kb

input:

14
3 3
1 2
2 3
2 3
2 3
1 1
2 3
1 3
3 3
1 3
1 3
1 2
2 3
1 3
-9807452 -9610069 4156341 2862447 6969109 -7245265 -2653530 -5655094 6467527 -6872459 3971784 7312155 9766298 -2719573

output:

-16558567

result:

ok single line: '-16558567'

Test #7:

score: -100
Wrong Answer
time: 0ms
memory: 4060kb

input:

14
1 2
1 4
2 3
3 5
4 5
2 5
2 4
2 4
1 2
3 4
1 5
2 4
1 1
4 5
-13763 -7354207 1096407 -9063321 -4824546 -6275546 1258145 -5272834 -8631107 3581157 2320771 -7714508 8446625 -6816167

output:

-1535325

result:

wrong answer 1st lines differ - expected: '-2673021', found: '-1535325'