QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#131341#6331. Jewel GameEnergy_is_not_overWA 209ms10868kbC++175.9kb2023-07-26 22:52:252023-07-26 22:52:26

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-26 22:52:26]
  • 评测
  • 测评结果:WA
  • 用时:209ms
  • 内存:10868kb
  • [2023-07-26 22:52:25]
  • 提交

answer

//
// Created by Barichek on 21.07.2023 15:43:48
//

#include <bits/stdc++.h>

#define F first
#define S second
#define MP make_pair
#define PB push_back

#define all(a) a.begin(), a.end()
#define len(a) (int) (a.size())
#define mp make_pair
#define pb push_back
#define fir first
#define sec second

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef long double ld;

#ifdef Energy_is_not_over
#define DEBUG for (bool ____DEBUG = true; ____DEBUG; ____DEBUG = false)
#define LOG(...) print(#__VA_ARGS__" ::", __VA_ARGS__) << endl

template<class ...Ts>
auto &print(Ts ...ts) { return ((cerr << ts << " "), ...); }

#else
#define DEBUG while (false)
#define LOG(...)
#endif

const int max_n = 30, inf = 1000111222;

const int max_k=10;

inline bool get_bit(ll mask,int bit)
{
    return (mask>>bit)&1;
}

bool maximize(int& a,int b)
{
    if (a<b){
        a=b;
        return 1;
    }
    return 0;
}

bool minimize(int& a,int b)
{
    if (a>b){
        a=b;
        return 1;
    }
    return 0;
}

int n,m,a,b;
int k;

bool edge[max_n][max_n];
int vertex_cost[max_n];
int vertex_id_in_mask[max_k];
int pos_in_mask_for_vertex[max_n];

int global_mask;
int dp[(1ll<<max_k)][2][max_n][max_n];
int cur_outs_A[max_n][max_n];
bool cur_calculated_B[max_n][max_n];

set<pair<int,pii>> pq;

inline void process_cur_A(int i,int j)
{
    if (dp[global_mask][0][i][j]==-inf){
        dp[global_mask][0][i][j]=0;
    }
    else{
        if (pos_in_mask_for_vertex[j]==-1 || get_bit(global_mask,pos_in_mask_for_vertex[j])){
            for (int k=0;k<n;k++){
                if (edge[k][j]){
                    int buf = dp[global_mask][1][i][k];
                    if (minimize(dp[global_mask][1][i][k],dp[global_mask][0][i][j])){
                        pq.erase(mp(buf,mp(i,j)));
                        pq.insert(mp(dp[global_mask][1][i][k],mp(i,j)));
                    }
                }
            }
        }
    }
    LOG("final value of dp[global_mask][0][i][j]",i,j,dp[global_mask][0][i][j]);
    cur_outs_A[i][j]=inf;
}

int main() {
   // freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin>>n>>m>>a>>b;
    a--;
    b--;
    for (int i=0;i<n;i++){
        pos_in_mask_for_vertex[i]=-1;
    }
    for (int i=0;i<m;i++){
        int u,v;
        cin>>u>>v;
        u--;
        v--;
        edge[u][v]=1;
    }
    cin>>k;
    LOG(k);
    for (int i=0;i<k;i++){
        int x,w;
        cin>>x>>w;
        x--;
        vertex_id_in_mask[i]=x;
        vertex_cost[x]=w;
        pos_in_mask_for_vertex[x]=i;
    }
    for (int i=0;i<(1ll<<k);i++){
        for (int j=0;j<n;j++){
            for (int k=0;k<n;k++){
                dp[i][0][j][k]=-inf;
                dp[i][1][j][k]=+inf;
            }
        }
    }
    for (global_mask=(1ll<<k)-1;global_mask>=0;global_mask--){
        LOG(bitset<4>(global_mask));
        {
            for (int i=0;i<n;i++){
                for (int j=0;j<n;j++){
                    for (int k=0;k<n;k++){
                        if (edge[i][k] && (pos_in_mask_for_vertex[k]!=-1 && !get_bit(global_mask,pos_in_mask_for_vertex[k]))){
                            maximize(dp[global_mask][0][i][j],dp[global_mask+(1ll<<pos_in_mask_for_vertex[k])][1][k][j]+vertex_cost[k]);
                        }
                    }
                }
            }
            for (int i=0;i<n;i++){
                for (int j=0;j<n;j++){
                    for (int k=0;k<n;k++){
                        if (edge[j][k] && (pos_in_mask_for_vertex[k]!=-1 && !get_bit(global_mask,pos_in_mask_for_vertex[k]))){
                            minimize(dp[global_mask][1][i][j],dp[global_mask+(1ll<<pos_in_mask_for_vertex[k])][0][i][k]-vertex_cost[k]);
                        }
                    }
                    pq.insert(mp(dp[global_mask][1][i][j],mp(i,j)));
                }
            }
        }

        {
            memset(cur_outs_A,0,sizeof(cur_outs_A));
            for (int i=0;i<n;i++){
                for (int j=0;j<n;j++){
                    for (int k=0;k<n;k++){
                        if (edge[i][k] && (pos_in_mask_for_vertex[k]==-1 || get_bit(global_mask,pos_in_mask_for_vertex[k]))){
                            cur_outs_A[i][j]++;
                        }
                    }
                }
            }
            for (int i=0;i<n;i++){
                for (int j=0;j<n;j++){
                    if (cur_outs_A[i][j]==0){
                        process_cur_A(i,j);
                    }
                }
            }
            memset(cur_calculated_B,0,sizeof(cur_calculated_B));
            while (!pq.empty()){
                auto now=*pq.begin();
                pq.erase(pq.begin());
                int B_i=now.sec.fir;
                int B_j=now.sec.sec;
                if (cur_calculated_B[B_i][B_j]){
                    continue;
                }
                if (dp[global_mask][1][B_i][B_j]==+inf){
                    dp[global_mask][1][B_i][B_j]=0;
                }
                LOG("final value of dp[global_mask][1][i][j]",B_i,B_j,dp[global_mask][1][B_i][B_j]);
                cur_calculated_B[B_i][B_j]=1;
                if (pos_in_mask_for_vertex[B_i]==-1 || get_bit(global_mask,pos_in_mask_for_vertex[B_i])){
                    for (int k=0;k<n;k++){
                        if (edge[k][B_i]){
                            maximize(dp[global_mask][0][k][B_j],dp[global_mask][1][B_i][B_j]);
                            if ((--cur_outs_A[k][B_j])==0){
                                process_cur_A(k,B_j);
                            }
                        }
                    }
                }
            }
        }
    }
    cout<<dp[0][0][a][b]<<"\n";
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3588kb

input:

5 16 1 1
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 2
3 4
3 5
4 2
4 3
4 5
5 2
5 3
5 4
4
2 4
3 84
4 38
5 96

output:

46

result:

ok 1 number(s): "46"

Test #2:

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

input:

8 16 8 4
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 1
1 5
2 6
3 7
4 8
5 1
6 2
7 3
8 4
6
1 29
2 34
3 41
5 7
6 26
7 94

output:

-23

result:

ok 1 number(s): "-23"

Test #3:

score: 0
Accepted
time: 1ms
memory: 3508kb

input:

5 5 2 1
1 1
2 3
3 4
4 5
5 2
2
4 1000000
5 100000

output:

1100000

result:

ok 1 number(s): "1100000"

Test #4:

score: 0
Accepted
time: 3ms
memory: 5868kb

input:

10 20 1 2
1 4
1 7
2 2
2 4
3 6
3 3
4 8
4 7
5 7
5 1
6 9
6 2
7 9
7 3
8 8
8 6
9 7
9 8
10 10
10 2
8
3 92067840
4 2874502
5 36253165
6 70758738
7 4768969
8 16029185
9 16207515
10 44912151

output:

132484345

result:

ok 1 number(s): "132484345"

Test #5:

score: 0
Accepted
time: 209ms
memory: 10868kb

input:

30 900 1 2
2 25
8 21
22 16
26 29
12 24
1 8
7 14
22 27
27 20
5 24
21 21
21 10
30 28
5 16
12 3
16 1
21 2
24 23
24 14
9 7
9 18
20 22
6 1
30 3
11 6
2 17
18 13
28 20
5 15
26 16
9 14
30 23
4 23
4 2
9 5
21 29
1 30
12 14
16 27
28 22
15 7
23 10
13 16
1 15
22 9
13 12
30 18
10 5
25 28
3 17
30 30
7 17
11 24
12 ...

output:

40915541

result:

ok 1 number(s): "40915541"

Test #6:

score: 0
Accepted
time: 206ms
memory: 10696kb

input:

30 900 1 1
16 16
26 15
20 25
9 28
27 1
25 18
12 6
7 26
14 15
28 21
18 19
12 3
26 29
28 24
8 8
22 9
18 3
9 2
26 9
29 21
13 28
21 24
18 2
30 8
1 25
19 26
4 19
2 25
14 27
14 12
2 23
23 15
16 5
9 29
10 27
29 16
16 20
5 8
3 28
12 12
30 7
16 29
30 17
3 11
21 26
18 14
14 6
26 4
21 29
3 6
11 15
22 4
14 18
1...

output:

38892888

result:

ok 1 number(s): "38892888"

Test #7:

score: 0
Accepted
time: 1ms
memory: 3448kb

input:

9 58 5 4
4 6
8 9
5 3
6 5
7 1
5 9
6 3
2 1
4 8
2 9
3 4
1 2
8 5
5 2
1 3
2 3
9 5
4 3
3 1
5 4
9 1
6 7
2 8
7 3
2 5
8 3
2 7
5 8
4 7
9 2
4 5
5 7
3 7
6 8
1 4
9 4
9 8
7 9
1 1
4 4
3 6
1 8
6 6
5 5
9 9
5 1
1 6
2 4
3 2
5 6
3 3
2 6
7 4
6 2
3 9
6 9
8 8
9 7
2
1 28323506
7 18381394

output:

46704900

result:

ok 1 number(s): "46704900"

Test #8:

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

input:

8 11 4 4
4 6
7 6
8 2
5 8
3 4
2 3
8 6
5 1
6 6
1 8
8 4
4
2 75547123
5 9278878
7 13909469
8 57425260

output:

0

result:

ok 1 number(s): "0"

Test #9:

score: 0
Accepted
time: 1ms
memory: 3672kb

input:

4 10 1 2
2 3
1 3
4 4
1 4
3 3
4 3
1 2
3 1
2 4
1 1
2
3 35669800
4 36664186

output:

994386

result:

ok 1 number(s): "994386"

Test #10:

score: 0
Accepted
time: 9ms
memory: 4572kb

input:

17 125 15 14
12 5
13 11
13 12
9 13
16 2
13 3
1 14
16 14
13 10
3 2
17 14
14 12
8 11
10 1
9 8
14 2
13 6
3 3
7 1
11 12
16 17
10 4
15 10
12 11
10 10
4 9
14 16
9 3
4 8
15 5
2 12
7 11
14 1
10 3
4 11
4 4
8 12
8 7
9 16
15 13
17 9
1 10
8 5
13 4
13 16
15 15
9 10
17 4
10 17
2 16
13 1
15 9
5 7
14 11
10 9
5 5
9 ...

output:

-33927098

result:

ok 1 number(s): "-33927098"

Test #11:

score: 0
Accepted
time: 2ms
memory: 3656kb

input:

11 18 8 7
5 11
9 3
1 8
6 11
11 5
5 9
1 9
2 5
10 2
4 10
7 1
6 2
10 8
3 9
8 6
3 7
7 11
2 10
5
2 22754552
5 84549882
6 19922948
9 13449629
11 18334746

output:

-73656757

result:

ok 1 number(s): "-73656757"

Test #12:

score: 0
Accepted
time: 1ms
memory: 3492kb

input:

3 8 2 3
1 3
3 2
1 2
3 3
2 1
2 3
3 1
2 2
1
1 53102229

output:

53102229

result:

ok 1 number(s): "53102229"

Test #13:

score: 0
Accepted
time: 1ms
memory: 3556kb

input:

3 6 1 1
1 3
2 3
3 1
2 2
1 2
2 1
1
3 88674071

output:

88674071

result:

ok 1 number(s): "88674071"

Test #14:

score: -100
Wrong Answer
time: 1ms
memory: 3760kb

input:

10 22 3 3
5 6
2 9
1 4
6 4
7 9
3 4
4 3
4 2
6 3
10 8
8 1
8 2
9 4
5 10
4 10
7 3
7 6
10 9
1 1
1 10
10 5
2 3
4
1 12017417
2 33560186
9 68408625
10 44302781

output:

79151220

result:

wrong answer 1st numbers differ - expected: '91168637', found: '79151220'