CSES - NOI 2024 - Results
Submission details
Task:Anime Shops
Sender:John Hedin
Submission time:2024-03-06 16:41:03 +0200
Language:C++ (C++17)
Status:READY
Result:39
Feedback
groupverdictscore
#1ACCEPTED23
#2ACCEPTED16
#30
Test results
testverdicttimegroup
#1ACCEPTED0.01 s1, 3details
#2ACCEPTED0.01 s1, 3details
#3ACCEPTED0.01 s1, 3details
#4ACCEPTED0.01 s1, 3details
#5ACCEPTED0.39 s3details
#6ACCEPTED0.87 s3details
#7--3details
#8--3details
#9ACCEPTED0.11 s2, 3details
#10ACCEPTED0.14 s2, 3details
#11ACCEPTED0.45 s2, 3details
#12ACCEPTED0.13 s3details
#13ACCEPTED0.15 s3details
#14ACCEPTED0.26 s3details
#15ACCEPTED0.10 s3details
#16ACCEPTED0.13 s3details

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:19:36: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 | #define rep(a,b,c) for(ll a = b; a < c; a++)
      |                                    ^
input/code.cpp:98:17: note: in expansion of macro 'rep'
   98 |                 rep(j,0,edges[tmp].size()) {
      |                 ^~~

Code

#include <iostream>
#include <vector>
#include <set>
#include <map>

using namespace std;

const bool d = false;

typedef long long ll;
typedef vector<ll> vll;
typedef pair<ll,ll> pll;
typedef set<ll> sll;
typedef vector<vll> vvll;
typedef vector<pll> vpll;
typedef map<ll,sll> mllsll;
typedef vector<mllsll> vm;

#define rep(a,b,c) for(ll a = b; a < c; a++)
#define rrep(a,b,c) for(ll a = c-1; a >=  b; a--)
#define itr_rep(a,b,_type) for(_type::iterator a = b.begin(); a != b.end(); a++)
#define pb push_back
#define mp make_pair
#define sz size
#define all(a) a.begin(),a.end()

ll n;
ll m;
ll k;
vll shops;

vvll edges;

vpll closest;

vm curr;
vm proc;

sll curr_marked;
sll proc_marked;

int main() {
    cin >> n;
    cin >> m;
    cin >> k;
    shops.resize(k,0);
    rep(i,0,k) {cin >> shops[i];}
    rep(i,0,k) {shops[i]--;} // 1-indexing
    edges.resize(n,vll());
    rep(i,0,m) {
        ll a;
        ll b;
        cin >> a;
        cin >> b;
        a--;
        b--;
        edges[a].pb(b);
        edges[b].pb(a); 
    }

    closest.resize(n,mp(-1,-1));

    proc.resize(n,mllsll());
    curr.resize(n,mllsll());
    proc_marked.clear();
    curr_marked.clear();

    rep(i,0,k) {
        proc[shops[i]][i] = sll();
        proc_marked.insert(shops[i]);
    }

    if (d) {cout << "here" << endl;}

    ll dist = 0;

    while (proc_marked.size() > 0) {
        if (d) {cout << "new itr" << endl;}
        swap(curr,proc);
        swap(curr_marked,proc_marked);
        itr_rep(e,proc_marked,sll) {proc[*e].clear();}
        proc_marked.clear();
        if (d) {cout << "cleared" << endl;}

        itr_rep(elem,curr_marked,sll) {
            if (d) {cout << "new elem" << endl;}
            ll tmp = (*elem);
            itr_rep(e, curr[tmp], mllsll) { // *e: <ll, set<ll> > - <id, <previous> >
                if (closest[tmp].first == -1) {
                    closest[tmp].first = dist;
                    if (d) {cout << tmp << ": " << (*e).first << " " << dist << endl;}
                } else if (closest[tmp].second == -1) {
                    closest[tmp].second = dist;
                    if (d) {cout << tmp << ": " << (*e).first << " " << dist << endl;}
                } else {break;}
                if (d) {cout << "didnt break" << endl;}
                // propagate
                rep(j,0,edges[tmp].size()) {
                    if ((*e).second.count(edges[tmp][j]) == 0) { // Node not visited before
                        if (curr[edges[tmp][j]].count((*e).first) == 0) { // Id not in the node in this step
                            if (d) {cout << "inside: " << edges[tmp][j] << endl;}
                            // goto node
                            pair<mllsll::iterator, bool> temp = proc[edges[tmp][j]].insert(mp((*e).first,sll()));
                            (*(temp.first)).second.insert(tmp); // add tmp as a previous node
                            proc_marked.insert(edges[tmp][j]); // add new node to will visit queue
                        }
                    }
                    if (d) {cout << "end" << endl;}
                }
                if (d) {cout << "end2" << endl;}
            }
        }

        if (d) {
            cout << dist << ": ";
            rep(i,0,n) {cout << closest[i].first << " ";}
            cout << endl;
            rep(i,0,n) {cout << closest[i].second << " ";}
            cout << endl;
        }
        dist++;
    }

    if (d) {cout << "done" << endl;}

    vll ans;
    ans.resize(n,0);
    rep(i,0,n) {ans[i] = closest[i].first;}
    if (d) {
        rep(i,0,n) {cout << ans[i] << " ";}
        cout << endl;
    }
    rep(i,0,k) {ans[shops[i]] = closest[shops[i]].second;}
    rep(i,0,n) {cout << ans[i] << " ";}
    cout << endl;
    return 0;
}

Test details

Test 1

Group: 1, 3

Verdict: ACCEPTED

input
1000 2000 1
816
1 868
976 995
377 536
...

correct output
4 3 3 4 6 4 -1 4 5 2 2 5 5 3 5...

user output
4 3 3 4 6 4 -1 4 5 2 2 5 5 3 5...
Truncated

Test 2

Group: 1, 3

Verdict: ACCEPTED

input
1000 2000 20
578 955 222 813 494 962 753 71...

correct output
5 6 4 3 4 2 -1 3 3 3 4 3 2 3 -...

user output
5 6 4 3 4 2 -1 3 3 3 4 3 2 3 -...
Truncated

Test 3

Group: 1, 3

Verdict: ACCEPTED

input
1000 2000 100
945 230 119 680 975 520 490 28...

correct output
2 2 3 -1 2 -1 3 2 2 1 2 -1 3 2...

user output
2 2 3 -1 2 -1 3 2 2 1 2 -1 3 2...
Truncated

Test 4

Group: 1, 3

Verdict: ACCEPTED

input
1000 2000 1000
150 443 960 545 218 487 896 38...

correct output
1 -1 1 1 -1 1 1 1 -1 1 1 1 -1 ...

user output
1 -1 1 1 -1 1 1 1 -1 1 1 1 -1 ...
Truncated

Test 5

Group: 3

Verdict: ACCEPTED

input
100000 200000 1
77222
59470 61811
43092 48939
14395 19964
...

correct output
8 10 8 8 8 8 8 8 9 7 7 8 8 8 6...

user output
8 10 8 8 8 8 8 8 9 7 7 8 8 8 6...
Truncated

Test 6

Group: 3

Verdict: ACCEPTED

input
100000 200000 20
70440 82302 64483 96767 51485 ...

correct output
-1 8 6 5 5 7 6 7 6 6 8 5 6 4 5...

user output
-1 8 6 5 5 7 6 7 6 6 8 5 6 4 5...
Truncated

Test 7

Group: 3

Verdict:

input
100000 200000 100
68738 37820 55519 77758 46482 ...

correct output
4 5 5 5 5 4 6 -1 5 4 5 6 4 5 5...

user output
(empty)

Test 8

Group: 3

Verdict:

input
100000 200000 100000
47137 80137 73347 78145 9205 6...

correct output
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

user output
(empty)

Test 9

Group: 2, 3

Verdict: ACCEPTED

input
100000 99999 1
44158
1 2
2 3
3 4
...

correct output
44157 44156 44155 44154 44153 ...

user output
44157 44156 44155 44154 44153 ...
Truncated

Test 10

Group: 2, 3

Verdict: ACCEPTED

input
100000 99999 20
44158 25720 84658 90057 99607 ...

correct output
361 360 359 358 357 356 355 35...

user output
361 360 359 358 357 356 355 35...
Truncated

Test 11

Group: 2, 3

Verdict: ACCEPTED

input
100000 99999 100000
44158 25720 84658 90057 99607 ...

correct output
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

user output
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
Truncated

Test 12

Group: 3

Verdict: ACCEPTED

input
100000 99999 3
99998 99999 100000
1 2
1 3
1 4
...

correct output
33333 33332 33332 33332 33331 ...

user output
33333 33332 33332 33332 33331 ...
Truncated

Test 13

Group: 3

Verdict: ACCEPTED

input
100000 99999 300
99701 99702 99703 99704 99705 ...

correct output
333 333 333 333 333 333 333 33...

user output
333 333 333 333 333 333 333 33...
Truncated

Test 14

Group: 3

Verdict: ACCEPTED

input
100000 99999 30000
70001 70002 70003 70004 70005 ...

correct output
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 ...

user output
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 ...
Truncated

Test 15

Group: 3

Verdict: ACCEPTED

input
100000 0 100000
1 2 3 4 5 6 7 8 9 10 11 12 13 ...

correct output
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...

user output
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
Truncated

Test 16

Group: 3

Verdict: ACCEPTED

input
100000 100000 2
1 50001
1 2
2 3
3 4
...

correct output
50000 1 2 3 4 5 6 7 8 9 10 11 ...

user output
50000 1 2 3 4 5 6 7 8 9 10 11 ...
Truncated