Submission details
Task:Fragile network
Sender:aalto26fw_003
Submission time:2026-10-07 16:50:23 +0300
Language:C++ (C++20)
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.00 sdetails
#3ACCEPTED0.00 sdetails
#4ACCEPTED0.00 sdetails
#50.00 sdetails
#6ACCEPTED0.08 sdetails
#7ACCEPTED0.08 sdetails
#8ACCEPTED0.09 sdetails
#9ACCEPTED0.08 sdetails
#10ACCEPTED0.08 sdetails
#11ACCEPTED0.00 sdetails
#120.00 sdetails
#130.00 sdetails
#140.06 sdetails
#150.00 sdetails
#160.00 sdetails
#170.00 sdetails
#180.00 sdetails
#19ACCEPTED0.00 sdetails
#200.00 sdetails
#21ACCEPTED0.00 sdetails

Code

#include <iostream>
#include <vector>
#include <functional>
#include <set>
#include <algorithm>
#include <stack>
#include <unordered_map>
#include <map>
#include <iomanip>
#include <limits>
#include <queue>

typedef long long Int;

std::tuple<Int> readInt1(){
    Int a;
    std::cin >> a;
    return {a};
}
std::tuple<Int,Int> readInt2(){
    Int a, b;
    std::cin >> a >> b;
    return {a,b};
}
std::tuple<Int,Int,Int> readInt3(){
    Int a, b, c;
    std::cin >> a >> b >> c;
    return {a,b,c};
}

std::vector<Int> readVecInt(Int n){
    std::vector<Int> arr(n);
    for (Int i = 0; i < n; i++){
        Int a;
        std::cin >> a;
        arr[i] = a;
    }
    return arr;
}
std::vector<std::string> readVecStr(Int n){
    std::vector<std::string> arr(n);
    for (Int i = 0; i < n; i++){
        std::string a;
        std::cin >> a;
        arr[i] = a;
    }
    return arr;
}

std::vector<long long> readVecLong(Int n){
    std::vector<long long> arr(n);
    for (Int i = 0; i < n; i++){
        long long a;
        std::cin >> a;
        arr[i] = a;
    }
    return arr;
}

std::vector<std::tuple<Int,Int>> readVecTup2(Int n){
    std::vector<std::tuple<Int,Int>> arr(n);
    for (Int i = 0; i < n; i++){
        Int a, b;
        std::cin >> a;
        std::cin >> b;
        arr[i] = {a,b};
    }
    return arr;
}

std::vector<std::tuple<Int,Int,Int>> readVecTup3(Int n){
    std::vector<std::tuple<Int,Int,Int>> arr(n);
    for (Int i = 0; i < n; i++){
        Int a, b, c;
        std::cin >> a;
        std::cin >> b;
        std::cin >> c;
        arr[i] = {a,b,c};
    }
    return arr;
}
std::vector<std::tuple<Int,Int,Int,Int>> readVecTup4(Int n){
    std::vector<std::tuple<Int,Int,Int,Int>> arr(n);
    for (Int i = 0; i < n; i++){
        Int a, b, c,d;
        std::cin >> a;
        std::cin >> b;
        std::cin >> c;
        std::cin >> d;
        arr[i] = {a,b,c,d};
    }
    return arr;
}

void printNewLine(){std::cout << "\n";}
template<typename T, typename... Ts>
std::tuple<Ts...> tail(std::tuple<T,Ts...> as){
    return std::apply([](T &a, Ts... b){return std::make_tuple(b...);},as);
}

template<typename T>
void print(T a){std::cout << std::setprecision(19) << a;}
template<typename... T>
void println(T... a);

template<typename T, typename Ts>
void print(std::tuple<T,Ts> a){
    print(std::get<0>(a));
    print(" ");
    print(std::get<1>(a));
}

template<typename T, typename... Ts>
void print(std::tuple<T,Ts...> a){
    print(std::get<0>(a));
    print(" ");
    print(tail(a));
}

template<typename T>
void print(const std::vector<T> &arr, Int width = -1){
    if (width == -1) width = arr.size();
    for (Int i = 0; i < (Int)arr.size(); i++){
        print(arr[i]);
        if (i+1 == (Int)arr.size()) continue;
        if ((i%width) == width-1) printNewLine();
        if ((i%width) != width-1) print(" ");
    }    
}
template<typename... T>
void println(T... a){print(a...);printNewLine();}



template<typename T>
void sorted(std::vector<T> &arr){
    std::sort(arr.begin(),arr.end(),[](const T &a, const T &b){ return a < b; });
}


template<typename T>
std::set<T> toSet(const std::vector<T> &vec){
    std::set<T> c;
    for (T a : vec){ c.emplace(a);}
    return c;
}

template<typename T, typename N>
std::vector<N> map(const std::vector<T> &a, const std::function<N(T)> &transform){
    std::vector<N> b(a.size());
    Int i = 0;
    for (T x : a){
        b[i] = transform(x);
        i++;
    }
    return b;
}

template<typename N, typename M, typename R>
std::vector<R> zip(const std::vector<N> &a, const  std::vector<M> &b, const std::function<R(N,M)> &transform){
    Int n = std::min(a.size(),b.size());
    std::vector<R> res(n);
    for (Int i = 0; i < n; i++){
        res[i] = transform(a[i],b[i]);
    }
    return res;
}

template<typename T, typename N>
std::vector<N> convertVec(const std::vector<T> &a){
    std::vector<N> b(a.size());
    Int i = 0;
    for (T x : a){
        b[i] = x;
        i++;
    }
    return b;
}
template<typename T>
std::vector<T> reverse(const std::vector<T> &a){
    std::vector<T> b(a.size());
    Int i = 0;
    for (T x : a){
        b[a.size()-1-i] = x;
        i++;
    }
    return b;
}



template<typename T, typename R>
R reduce(const std::vector<T> &arr, R init, const std::function<R(const R,const T)> &transform){
    R current = init;
    for (Int idx = 0; idx < (Int)arr.size(); idx++){
        current = transform(current,arr[idx]);
    };
    return current;
}
template<typename T>
T max(const std::vector<T> &arr){return reduce(arr, arr[0], static_cast<std::function<T(const T,const T)>>(static_cast<const T& (*)(const T&, const T&)>(std::max<T>)));}
template<typename T>
T min(const std::vector<T> &arr){return reduce(arr, arr[0], static_cast<std::function<T(const T,const T)>>(static_cast<const T& (*)(const T&, const T&)>(std::min<T>)));}

template<typename T>
std::function<T(const T,const T)> add(){return [](T a,T b){return a+b;};}
template<typename T>
std::function<T(const T,const T)> modAdd(T mod){return [mod](T a,T b){return (((a+b)%mod)+mod)%mod;};}
template<typename T, typename R>
std::function<R(const R,const T)> mulAdd(R mul){return [mul](R a,T b){return a+b*mul;};}
template<typename T>
T sum(const std::vector<T> &arr){return reduce(arr, 0, add<T>());}
template<typename T>
T avg(const std::vector<T> &arr){return reduce(arr, 0.0, mulAdd<double,T>(1.0/arr.size()));}

template<typename T>
T binarySearch(T min, T max, const std::function<bool(T)> &leq){
    if (min == max) return max;
    T guess = (min+max)/2;
    if (leq(guess)){
        return binarySearch(min,guess,leq);
    }else{
        return binarySearch(guess+1,max,leq);
    }
}

template<typename T>
T binarySearchDecending(T min, T max, const std::function<bool(T)> &leq){
    std::function<bool(T)> gt = [leq](T x){
        return !leq(x);
    };
    return binarySearch(min,max+1, gt)-1;
}

template<typename T>
std::vector<T> cloneVec(std::vector<T> a){return a;}

template<typename T>
std::vector<T> padding(const std::vector<T> &initial, T num, Int start, Int end){
    std::vector<T> arr(start+initial.size()+end);
    for (Int i = 0; i < start; i++){
        arr[i] = num;
    }
    for (Int i = 0; i < (Int)initial.size(); i++){
        arr[start+i] = initial[i];
    }
    for (Int i = 0; i < end; i++){
        arr[start+initial.size()+i] = num;
    }
    return arr;
}

template<typename T>
Int findMax(Int start, Int end, const std::function<T(Int)> &maxHeuristic){
    T initialGuess = maxHeuristic(start);
    Int index = start;
    for (Int i = start; i <= end; i++){
        if (initialGuess < maxHeuristic(i)){
            initialGuess = maxHeuristic(i);
            index = i;
        }
    }
    return index;
}

template<typename T>
void operateOnMax(Int start, Int end, const std::function<T(Int)> &maxHeuristic, const std::function<void(Int)> &found){
    found(findMax(start,end,maxHeuristic));
}

template<typename T>
void stackOperate(std::vector<T> init, const std::function<std::vector<T>(T)> operate){
    std::stack<T> stack;
    for (auto x : init){
        stack.push(x);
    }
    while (!stack.empty()){
        T next = stack.top();
        stack.pop();
        std::vector<T> nextSteps = operate(next);
        for (T a : nextSteps){
            stack.push(a);
        }
    }
}

template<typename T>
void queueOperate(std::vector<T> init, const std::function<std::vector<T>(T)> operate){
    std::queue<T> que;
    for (auto x : init){
        que.push(x);
    }
    while (!que.empty()){
        T next = que.front();
        que.pop();
        std::vector<T> nextSteps = operate(next);
        for (T a : nextSteps){
            que.push(a);
        }
    }
}

template<typename T>
void priorityQueueOperate(std::vector<T> init, const std::function<std::vector<T>(T)> operate){
    std::priority_queue<T> que;
    for (auto x : init){
        que.push(x);
    }
    while (!que.empty()){
        T next = que.top();
        que.pop();
        std::vector<T> nextSteps = operate(next);
        for (T a : nextSteps){
            que.push(a);
        }
    }
}

template<typename T>
void recursiveVectorSplit(Int start, Int end, Int distl, Int distr, const std::function<T(Int)> &maxHeuristic, const std::function<void(Int)> &found){
    if (start == end){
        return found(start);
    }else if (end < start){
        return;
    }
    std::tuple<Int,Int> range = {start,end};
    std::function<std::vector<std::tuple<Int,Int>>(std::tuple<Int,Int>)> splitter = [distl, distr,&maxHeuristic,&found](std::tuple<Int,Int> range){
        auto [start,end] = range;
        Int idx = findMax(start, end, maxHeuristic);
        found(idx);
        std::vector<std::tuple<Int,Int>> next;
        if (idx+distl+1 <= end){
            next.push_back({idx+distl+1,end});
        }
        if (start <= idx-distr-1){
            next.push_back({start, idx-distr-1});
        }
        return next;
    };
    stackOperate({range},splitter);
}


template<typename T>
std::vector<T> dynamicallyComputableList(Int n, std::function<T(std::vector<T>&,Int)> next){
    std::vector<T> arr(n);
    for (Int i = 0; i < n; i++){
        arr[i] = next(arr,i);
    }
    return arr;
}
template<typename T>
Int indexOfBinarySearch(const std::vector<T> &arr, const T &find){
    return binarySearch((Int)0,(Int)arr.size()-1,(std::function<bool(Int)>)[&arr, &find](Int guess){return find <= arr[guess];});
}

template<typename T>
std::unordered_map<T, Int> indexCompress(const std::vector<T> &arr){
    std::unordered_map<T, Int> compressed;
    Int i = 0;
    for (T x : arr){
        if (compressed.find(x) != compressed.end()) compressed[x] = i++;
    }
    return compressed;
}   

template<typename... Ts>
std::tuple<std::vector<std::tuple<Int,Ts...>>, std::vector<Int>> edgeIndexing(int n, std::vector<std::tuple<Int,Ts...>> edges){
    sorted(edges);
    std::vector<Int> edgeIndex(n+1);
    {
        Int j = 0;
        for (Int i = 0; i < (Int)edges.size(); i++) {
            auto a = std::get<0>(edges[i]);
            while (j <= a){
                edgeIndex[j++] = i;
            }
        }
        while (j < n){
            edgeIndex[j++] = edges.size();
        }
        edgeIndex[n] = edges.size(); 
    }
    return {edges,edgeIndex};
}


template<typename T>
std::tuple<std::vector<T>, std::vector<Int>> shortestPathDirected(const Int n, std::vector<std::tuple<Int, Int, T>> &edges, Int start){
    //assumes all paths are between 0 <= c < n
    //assumes 0 indexing
    std::vector<Int> path(n);
    std::vector<bool> edgeUpdated(n);
    std::vector<T> distance(n);
    for (Int i = 0; i < n; i++) path[i] = i;
    for (Int i = 0; i < n; i++) edgeUpdated[i] = true;
    edgeUpdated[start] = false;
    for (Int i = 0; i < n; i++) distance[i] = (T)0; //std::numeric_limits<T>::max()/4;
    distance[start] = std::numeric_limits<T>::max(); //0;
    sorted(edges);
    std::vector<Int> edgeIndex(n+1);
    {
        Int j = 0;
        for (Int i = 0; i < (Int)edges.size(); i++) {
            auto& [a,b,w] = edges[i];
            while (j <= a){
                edgeIndex[j++] = i;
            }
        }
        while (j < n){
            edgeIndex[j++] = edges.size();
        }
        edgeIndex[n] = edges.size(); 
    }
    std::function<std::vector<std::tuple<Int,Int>>(std::tuple<Int,Int>)> func = [&distance,&edgeIndex,&edges,&path,&edgeUpdated](std::tuple<Int,Int> propagateW){
        auto& [weight,propagate] = propagateW;
        std::vector<std::tuple<Int,Int>> next;
        //if (distance[propagate] != -weight) return next;
        if (edgeUpdated[propagate]) return next;
        for (Int i = edgeIndex[propagate]; i < edgeIndex[propagate+1]; i++){
            auto& [a, b, w] = edges[i];
            //if (distance[a]+w < distance[b]){
            if (std::min(distance[a],w) > distance[b]){
                //next.push_back({-(distance[a]+w),b});
                next.push_back({std::min(distance[a],w),b});
                distance[b] = std::min(distance[a],w);
                path[b] = a;
                edgeUpdated[b] = false;
            }
        }
        edgeUpdated[propagate] = true;
        return next;
    };
    priorityQueueOperate((std::vector<std::tuple<Int,Int>>){{0,start}},func);
    //for (Int i = 0; i < n; i++) {
    //    bool changed = false;
    //    for (auto& e : edges) {
    //        auto& [a, b, w] = e;
    //        if (!changed) {changed = (distance[b] != std::min(distance[b], distance[a]+w));}
    //        if (distance[a]+w < distance[b]){
    //            distance[b] = distance[a]+w;
    //            path[b] = a;
    //        }
    //    }
    //    if (!changed) break;
    //    if (changed && i == n){
    //        return std::tuple((std::vector<T>){},(std::vector<Int>){});
    //    }
    //}
    return std::tuple(distance,path);
}

std::vector<Int> pathFromPathMap(std::vector<Int> &map, Int goal){
    std::stack<Int> fullPath;
    fullPath.push(goal);
    while (map[fullPath.top()] != fullPath.top()){
        fullPath.push(map[fullPath.top()]);
    }
    std::vector<Int> p;
    while (!fullPath.empty()){
        p.push_back(fullPath.top());
        fullPath.pop();
    }
    return p;
}


template<typename T>
std::tuple<std::vector<T>, std::vector<Int>> shortestPath(const Int n, std::vector<std::tuple<Int, Int, T>> &edgesMessy, Int start){
    std::vector<std::tuple<Int, Int, T>> edges;
    for (auto e : edgesMessy){
        auto [a,b,t] = e;
        edges.push_back({a,b,t});
        edges.push_back({b,a,t});
    }
    return shortestPathDirected(n, edges, start);
}



template<typename T>
std::vector<T> distanceTable(const std::vector<T> &init, const  std::function<T(T,T)> &distance){
    Int n = init.size();
    std::vector<T> table(n*n);
    for (Int i = 0; i < n; i++){
        table[i+n*i] = init[i];
        for (Int j = i-1; j >= 0; j--){
            table[j+n*i] = distance(init[j],table[j+1+n*i]);
        }
        for (Int j = i+1; j < n; j++){
            table[j+n*i] = distance(table[j-1+n*i],init[j]);
        }
    }
    return table;
}

void particles(){
    auto [n] = readInt1();
    auto arr = readVecLong(n);
    std::vector<long long> table = distanceTable(arr,add<long long>());
    print(table,n);
    //println(cost[n*n-1]);
}
template<typename T>
std::vector<T> range(const std::vector<T> &a, Int from, Int to){
    std::vector<T> b;
    for (Int i = from; i < to; i++){
        b.push_back(a[i]);
    }
    return b;
}

template<typename T>
bool forall(const std::vector<T> &a, std::function<bool(T)> &test){
    bool res = true;
    for (auto v : a){
        res = res & test(v);
    }
    return res;
}

int main() {
    auto [n] = readInt1();
    auto edges = readVecTup2(n-1);
    for (auto& p : edges){
        auto [a,b] = p;
        p = {a-1,b-1};

    }
    for (auto& p : edges){
        auto [a,b] = p;
        if (a > b){
            p = {b,a};
        }
    }
    sorted(edges);
    std::vector<Int> connections(n,0);
    for (auto& p : edges){
        auto [a,b] = p;
        connections[a]++;
        connections[b]++;
    }
    std::vector<std::tuple<Int,Int>> conn;
    std::vector<Int> con(2);
    Int k = 0;
    for (Int i = 0; i < n; i++){
        if (connections[i]==1){
            con[k] = i;
            k = (k+1)%2;
            if (k==0) conn.push_back({con[0],con[1]});
        }
    }
    if (k==1){
        conn.push_back({0,con[0]});
    }
    for (auto& p : conn){
        auto [a,b] = p;
        p = {a+1,b+1};

    }
    println(conn.size());
    println(conn,1);
    return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
10
1 5
1 7
1 8
1 3
...

correct output
5
5 2
7 9
8 6
3 10
...

user output
5
2 3
4 5
6 7
8 9
...

Test 2

Verdict: ACCEPTED

input
10
4 5
3 4
2 3
9 10
...

correct output
1
10 1

user output
1
1 10

Test 3

Verdict: ACCEPTED

input
10
1 8
1 3
3 5
5 7
...

correct output
3
7 10
8 2
1 9

user output
3
2 7
8 9
1 10

Test 4

Verdict: ACCEPTED

input
10
1 5
3 7
2 10
3 8
...

correct output
3
10 8
6 4
5 9

user output
3
4 5
6 8
9 10

Test 5

Verdict:

input
10
4 8
3 4
4 6
2 3
...

correct output
3
8 7
10 9
1 6

user output
3
6 7
8 9
1 10

Test 6

Verdict: ACCEPTED

input
100000
1 56967
1 56618
1 42321
1 82550
...

correct output
50000
56967 16911
56618 39942
42321 99902
82550 2538
...

user output
50000
2 3
4 5
6 7
8 9
...

Test 7

Verdict: ACCEPTED

input
100000
92297 92298
23511 23512
68057 68058
65434 65435
...

correct output
1
100000 1

user output
1
1 100000

Test 8

Verdict: ACCEPTED

input
100000
17747 97512
10397 12053
679 6975
4013 14565
...

correct output
25057
92881 76094
20353 87429
16069 96487
71186 52809
...

user output
25057
388 577
715 785
837 1166
1220 1261
...

Test 9

Verdict: ACCEPTED

input
100000
72941 72942
11232 11233
73464 73465
30042 30043
...

correct output
489
16423 85168
20707 94190
36505 54940
96411 44067
...

user output
489
1 99
667 718
884 1400
1404 1453
...

Test 10

Verdict: ACCEPTED

input
100000
31451 31452
7473 7474
24056 24057
85181 85182
...

correct output
51
25638 2983
87594 87371
92001 50610
46744 100000
...

user output
51
1 140
346 1093
2983 5134
6092 6887
...

Test 11

Verdict: ACCEPTED

input
10
1 2
1 3
3 4
3 5
...

correct output
2
2 6
4 10

user output
2
2 4
6 10

Test 12

Verdict:

input
7
1 2
2 3
2 4
1 5
...

correct output
2
4 7
3 6

user output
2
3 4
6 7

Test 13

Verdict:

input
6
1 2
1 3
1 4
4 5
...

correct output
2
3 6
2 5

user output
2
2 3
5 6

Test 14

Verdict:

input
65538
1 2
1 3
1 4
3 5
...

correct output
16385
34 36
40 42
35 41
48 50
...

user output
16385
2 4
33 34
35 36
39 40
...

Test 15

Verdict:

input
11
1 2
1 3
2 4
2 5
...

correct output
2
9 11
8 10

user output
2
8 9
10 11

Test 16

Verdict:

input
7
1 2
1 3
2 4
2 5
...

correct output
2
5 7
4 6

user output
2
4 5
6 7

Test 17

Verdict:

input
7
1 2
1 3
2 4
2 5
...

correct output
2
5 7
4 6

user output
2
4 5
6 7

Test 18

Verdict:

input
10
8 4
3 4
4 6
2 3
...

correct output
3
8 7
10 9
1 6

user output
3
6 7
8 9
1 10

Test 19

Verdict: ACCEPTED

input
7
1 2
1 5
2 3
2 6
...

correct output
2
6 7
3 4

user output
2
3 4
6 7

Test 20

Verdict:

input
8
1 2
1 3
2 4
2 5
...

correct output
3
4 7
6 8
1 5

user output
3
4 5
6 7
1 8

Test 21

Verdict: ACCEPTED

input
10
2 1
3 1
4 2
5 4
...

correct output
3
9 8
6 10
3 7

user output
3
3 6
7 8
9 10