답안 #527366

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
527366 2022-02-17T09:54:49 Z 79brue From Hacks to Snitches (BOI21_watchmen) C++14
15 / 100
6000 ms 124192 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

struct dat{
    int x, f, y;
    int nxt=0;
    dat(){}
    dat(int x, int f, int y): x(x), f(f), y(y){}

    bool operator<(const dat &r)const{
        return y>r.y;
    }
};

int n, m, k;
vector<int> link[250002];
int cycleLen[250002];
int cycleIdx[250002];
vector<int> dist[250002];
vector<bool> visited[250002];
queue<dat> pq;
vector<dat> datList (3);

void update(dat tmp){
    if(tmp.x){
        if(visited[tmp.x][tmp.f]) return;
        visited[tmp.x][tmp.f] = 1;
        dist[tmp.x][tmp.f] = tmp.y;
    }
    pq.push(tmp);
}

int main(){
    scanf("%d %d", &n, &m);
    for(int i=1; i<=m; i++){
        int x, y;
        scanf("%d %d", &x, &y);
        link[x].push_back(y);
        link[y].push_back(x);
    }

    scanf("%d", &k);
    while(k--){
        int l;
        scanf("%d", &l);
        for(int j=0; j<l; j++){
            int tmp;
            scanf("%d", &tmp);
            cycleLen[tmp] = l;
            cycleIdx[tmp] = j;
        }
    }

    for(int i=1; i<=n; i++){
        if(!cycleLen[i]) cycleLen[i] = 1;
        dist[i] = vector<int> (cycleLen[i], 1e9);
        visited[i].resize(cycleLen[i]);
    }

    update(dat(1, 0, 0));

    int pqCnt = 0;
    while(!pq.empty()){
        dat tmp = pq.front(); pq.pop();
        int x = tmp.x, f = tmp.f, y = tmp.y;
        assert(++pqCnt <= 1000000);
//        printf("%d %d: %d\n", x, f, y);
//        assert(f < cycleLen[x]);

        if(tmp.nxt){
            pq.push(datList[tmp.nxt]);
        }
        if(tmp.x == 0) continue;

        if(x==n){
            printf("%d", y);
            return 0;
        }

        if(cycleLen[x] == 1){
            for(int nxt: link[x]){
                if(cycleLen[nxt] == 1) update(dat(nxt, 0, y+1));
                else{
                    if(visited[nxt][0] || visited[nxt][1] || visited[nxt][2]) continue;
                    int prv = 0;
                    for(int j=cycleLen[nxt]-1; j>=0; j--){
                        int nf = (y+1+j)%cycleLen[nxt];
                        if(nf == cycleIdx[nxt]){
                            datList.push_back(dat(0, 0, y+j+1));
                            datList.back().nxt = prv;
                            prv = (int)datList.size() - 1;
                        }
                        else{
                            datList.push_back(dat(nxt, nf, y+j+1));
                            datList.back().nxt = prv;
                            prv = (int)datList.size() - 1;
                            visited[tmp.x][tmp.f] = 1;
                            dist[tmp.x][tmp.f] = tmp.y;
                        }
                    }
                    update(datList.back());
                }
            }
        }
        else{
            for(int nxt: link[x]){
                if(cycleLen[nxt] == 1) update(dat(nxt, 0, y+1));
                else{
                    int nf = (f+1)%cycleLen[nxt];
                    if(nf == cycleIdx[nxt]) continue;
                    if(nf == cycleIdx[x] && f%cycleLen[nxt] == cycleIdx[nxt]) continue;
                    update(dat(nxt, nf, y+1));
                }
            }
        }
    }

    printf("impossible");
}

Compilation message

watchmen.cpp: In function 'int main()':
watchmen.cpp:37:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
watchmen.cpp:40:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   40 |         scanf("%d %d", &x, &y);
      |         ~~~~~^~~~~~~~~~~~~~~~~
watchmen.cpp:45:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |     scanf("%d", &k);
      |     ~~~~~^~~~~~~~~~
watchmen.cpp:48:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |         scanf("%d", &l);
      |         ~~~~~^~~~~~~~~~
watchmen.cpp:51:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |             scanf("%d", &tmp);
      |             ~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 23172 KB Output is correct
2 Correct 90 ms 31848 KB Output is correct
3 Correct 82 ms 31416 KB Output is correct
4 Correct 119 ms 37332 KB Output is correct
5 Correct 14 ms 21836 KB Output is correct
6 Correct 86 ms 31464 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 23196 KB Output is correct
2 Correct 86 ms 31900 KB Output is correct
3 Correct 100 ms 31412 KB Output is correct
4 Correct 160 ms 37360 KB Output is correct
5 Correct 12 ms 21872 KB Output is correct
6 Correct 79 ms 31448 KB Output is correct
7 Correct 79 ms 30932 KB Output is correct
8 Correct 89 ms 31008 KB Output is correct
9 Correct 82 ms 30916 KB Output is correct
10 Correct 124 ms 43504 KB Output is correct
11 Correct 93 ms 34252 KB Output is correct
12 Correct 99 ms 31228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 23196 KB Output is correct
2 Correct 86 ms 31900 KB Output is correct
3 Correct 100 ms 31412 KB Output is correct
4 Correct 160 ms 37360 KB Output is correct
5 Correct 12 ms 21872 KB Output is correct
6 Correct 79 ms 31448 KB Output is correct
7 Correct 79 ms 30932 KB Output is correct
8 Correct 89 ms 31008 KB Output is correct
9 Correct 82 ms 30916 KB Output is correct
10 Correct 124 ms 43504 KB Output is correct
11 Correct 93 ms 34252 KB Output is correct
12 Correct 99 ms 31228 KB Output is correct
13 Correct 39 ms 23172 KB Output is correct
14 Correct 122 ms 31936 KB Output is correct
15 Correct 95 ms 31484 KB Output is correct
16 Correct 123 ms 37332 KB Output is correct
17 Correct 11 ms 21836 KB Output is correct
18 Correct 94 ms 31380 KB Output is correct
19 Correct 92 ms 30952 KB Output is correct
20 Correct 85 ms 31208 KB Output is correct
21 Correct 79 ms 31040 KB Output is correct
22 Correct 128 ms 43420 KB Output is correct
23 Correct 108 ms 34260 KB Output is correct
24 Correct 89 ms 31256 KB Output is correct
25 Correct 1856 ms 79196 KB Output is correct
26 Correct 1754 ms 83320 KB Output is correct
27 Correct 1665 ms 79688 KB Output is correct
28 Correct 1332 ms 83124 KB Output is correct
29 Execution timed out 6058 ms 124192 KB Time limit exceeded
30 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 23196 KB Output is correct
2 Correct 86 ms 31900 KB Output is correct
3 Correct 100 ms 31412 KB Output is correct
4 Correct 160 ms 37360 KB Output is correct
5 Correct 12 ms 21872 KB Output is correct
6 Correct 79 ms 31448 KB Output is correct
7 Correct 79 ms 30932 KB Output is correct
8 Correct 89 ms 31008 KB Output is correct
9 Correct 82 ms 30916 KB Output is correct
10 Correct 124 ms 43504 KB Output is correct
11 Correct 93 ms 34252 KB Output is correct
12 Correct 99 ms 31228 KB Output is correct
13 Correct 39 ms 23172 KB Output is correct
14 Correct 122 ms 31936 KB Output is correct
15 Correct 95 ms 31484 KB Output is correct
16 Correct 123 ms 37332 KB Output is correct
17 Correct 11 ms 21836 KB Output is correct
18 Correct 94 ms 31380 KB Output is correct
19 Correct 92 ms 30952 KB Output is correct
20 Correct 85 ms 31208 KB Output is correct
21 Correct 79 ms 31040 KB Output is correct
22 Correct 128 ms 43420 KB Output is correct
23 Correct 108 ms 34260 KB Output is correct
24 Correct 89 ms 31256 KB Output is correct
25 Correct 1856 ms 79196 KB Output is correct
26 Correct 1754 ms 83320 KB Output is correct
27 Correct 1665 ms 79688 KB Output is correct
28 Correct 1332 ms 83124 KB Output is correct
29 Execution timed out 6058 ms 124192 KB Time limit exceeded
30 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 23172 KB Output is correct
2 Correct 90 ms 31848 KB Output is correct
3 Correct 82 ms 31416 KB Output is correct
4 Correct 119 ms 37332 KB Output is correct
5 Correct 14 ms 21836 KB Output is correct
6 Correct 86 ms 31464 KB Output is correct
7 Correct 27 ms 23196 KB Output is correct
8 Correct 86 ms 31900 KB Output is correct
9 Correct 100 ms 31412 KB Output is correct
10 Correct 160 ms 37360 KB Output is correct
11 Correct 12 ms 21872 KB Output is correct
12 Correct 79 ms 31448 KB Output is correct
13 Correct 79 ms 30932 KB Output is correct
14 Correct 89 ms 31008 KB Output is correct
15 Correct 82 ms 30916 KB Output is correct
16 Correct 124 ms 43504 KB Output is correct
17 Correct 93 ms 34252 KB Output is correct
18 Correct 99 ms 31228 KB Output is correct
19 Correct 12 ms 21836 KB Output is correct
20 Correct 11 ms 21708 KB Output is correct
21 Correct 13 ms 21836 KB Output is correct
22 Correct 30 ms 23196 KB Output is correct
23 Correct 124 ms 31912 KB Output is correct
24 Correct 89 ms 31492 KB Output is correct
25 Correct 124 ms 37368 KB Output is correct
26 Correct 13 ms 21836 KB Output is correct
27 Correct 111 ms 31368 KB Output is correct
28 Correct 94 ms 31004 KB Output is correct
29 Correct 81 ms 31100 KB Output is correct
30 Correct 95 ms 30980 KB Output is correct
31 Correct 127 ms 43516 KB Output is correct
32 Correct 94 ms 34212 KB Output is correct
33 Correct 82 ms 31232 KB Output is correct
34 Correct 1878 ms 79252 KB Output is correct
35 Correct 1902 ms 76048 KB Output is correct
36 Correct 2004 ms 76072 KB Output is correct
37 Incorrect 1558 ms 81164 KB Output isn't correct
38 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 23172 KB Output is correct
2 Correct 90 ms 31848 KB Output is correct
3 Correct 82 ms 31416 KB Output is correct
4 Correct 119 ms 37332 KB Output is correct
5 Correct 14 ms 21836 KB Output is correct
6 Correct 86 ms 31464 KB Output is correct
7 Correct 27 ms 23196 KB Output is correct
8 Correct 86 ms 31900 KB Output is correct
9 Correct 100 ms 31412 KB Output is correct
10 Correct 160 ms 37360 KB Output is correct
11 Correct 12 ms 21872 KB Output is correct
12 Correct 79 ms 31448 KB Output is correct
13 Correct 79 ms 30932 KB Output is correct
14 Correct 89 ms 31008 KB Output is correct
15 Correct 82 ms 30916 KB Output is correct
16 Correct 124 ms 43504 KB Output is correct
17 Correct 93 ms 34252 KB Output is correct
18 Correct 99 ms 31228 KB Output is correct
19 Correct 39 ms 23172 KB Output is correct
20 Correct 122 ms 31936 KB Output is correct
21 Correct 95 ms 31484 KB Output is correct
22 Correct 123 ms 37332 KB Output is correct
23 Correct 11 ms 21836 KB Output is correct
24 Correct 94 ms 31380 KB Output is correct
25 Correct 92 ms 30952 KB Output is correct
26 Correct 85 ms 31208 KB Output is correct
27 Correct 79 ms 31040 KB Output is correct
28 Correct 128 ms 43420 KB Output is correct
29 Correct 108 ms 34260 KB Output is correct
30 Correct 89 ms 31256 KB Output is correct
31 Correct 1856 ms 79196 KB Output is correct
32 Correct 1754 ms 83320 KB Output is correct
33 Correct 1665 ms 79688 KB Output is correct
34 Correct 1332 ms 83124 KB Output is correct
35 Execution timed out 6058 ms 124192 KB Time limit exceeded
36 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 23172 KB Output is correct
2 Correct 90 ms 31848 KB Output is correct
3 Correct 82 ms 31416 KB Output is correct
4 Correct 119 ms 37332 KB Output is correct
5 Correct 14 ms 21836 KB Output is correct
6 Correct 86 ms 31464 KB Output is correct
7 Correct 27 ms 23196 KB Output is correct
8 Correct 86 ms 31900 KB Output is correct
9 Correct 100 ms 31412 KB Output is correct
10 Correct 160 ms 37360 KB Output is correct
11 Correct 12 ms 21872 KB Output is correct
12 Correct 79 ms 31448 KB Output is correct
13 Correct 79 ms 30932 KB Output is correct
14 Correct 89 ms 31008 KB Output is correct
15 Correct 82 ms 30916 KB Output is correct
16 Correct 124 ms 43504 KB Output is correct
17 Correct 93 ms 34252 KB Output is correct
18 Correct 99 ms 31228 KB Output is correct
19 Correct 39 ms 23172 KB Output is correct
20 Correct 122 ms 31936 KB Output is correct
21 Correct 95 ms 31484 KB Output is correct
22 Correct 123 ms 37332 KB Output is correct
23 Correct 11 ms 21836 KB Output is correct
24 Correct 94 ms 31380 KB Output is correct
25 Correct 92 ms 30952 KB Output is correct
26 Correct 85 ms 31208 KB Output is correct
27 Correct 79 ms 31040 KB Output is correct
28 Correct 128 ms 43420 KB Output is correct
29 Correct 108 ms 34260 KB Output is correct
30 Correct 89 ms 31256 KB Output is correct
31 Correct 1856 ms 79196 KB Output is correct
32 Correct 1754 ms 83320 KB Output is correct
33 Correct 1665 ms 79688 KB Output is correct
34 Correct 1332 ms 83124 KB Output is correct
35 Execution timed out 6058 ms 124192 KB Time limit exceeded
36 Halted 0 ms 0 KB -