CSES - KILO 2016 1/5 - Results
Submission details
Task:Nice triplets
Sender::]
Submission time:2016-09-06 18:13:54 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.07 sdetails
#2ACCEPTED0.10 sdetails
#3ACCEPTED0.82 sdetails
#4ACCEPTED1.07 sdetails
#5ACCEPTED0.10 sdetails
#6ACCEPTED0.25 sdetails
#7ACCEPTED0.45 sdetails
#8ACCEPTED0.34 sdetails
#9ACCEPTED1.14 sdetails
#10ACCEPTED0.05 sdetails
#11ACCEPTED1.54 sdetails
#12ACCEPTED1.54 sdetails
#13ACCEPTED1.55 sdetails
#14ACCEPTED1.59 sdetails
#15ACCEPTED1.60 sdetails
#16ACCEPTED2.06 sdetails
#17ACCEPTED1.82 sdetails
#18ACCEPTED1.92 sdetails
#19ACCEPTED2.00 sdetails
#20ACCEPTED2.03 sdetails
#21ACCEPTED2.07 sdetails
#22ACCEPTED1.54 sdetails
#23ACCEPTED1.54 sdetails
#24ACCEPTED1.58 sdetails
#25ACCEPTED1.61 sdetails
#26ACCEPTED1.59 sdetails
#27ACCEPTED1.58 sdetails
#28ACCEPTED1.54 sdetails
#29ACCEPTED1.54 sdetails
#30ACCEPTED1.57 sdetails
#31ACCEPTED1.56 sdetails
#32ACCEPTED1.54 sdetails
#33ACCEPTED1.63 sdetails
#34ACCEPTED1.62 sdetails
#35ACCEPTED1.54 sdetails
#36ACCEPTED1.57 sdetails
#37ACCEPTED1.56 sdetails
#38ACCEPTED1.59 sdetails
#39ACCEPTED1.63 sdetails
#40ACCEPTED1.57 sdetails

Code

#include<iostream>
#include<vector>

using namespace std;

int64_t n;
void dfs1(const vector<vector<int>> &edges, vector<vector<int64_t>> &dp1, vector<int> &p, int cur, int par) {
    p[cur] = par;
    dp1[cur][0] = 1;
    for (auto nxt: edges[cur]) {
        if (nxt == par) continue;
        dfs1(edges, dp1, p, nxt, cur);
        for (int64_t i = 1; i < n; ++i) {
            dp1[cur][i] += dp1[nxt][i-1];
        }
    }
}

void dfs2(const vector<vector<int>> &edges, const vector<vector<int64_t>> &dp1, vector<vector<int64_t>> &dp2, int cur, int par) {
    if (par != -1) {
        dp2[cur][0] = 1;
        for (int64_t i = 1; i < n; ++i) {
            dp2[cur][i] += dp2[par][i-1];
        }
    }
    for (int64_t i = 2; i < n; ++i) {
        int64_t total = 0;
        /*for (auto nxt: edges[cur]) {
            if (nxt == par) continue;
            total += dp1[nxt][i];
        }*/
        total = dp1[cur][i-1];
        if (i < n - 1) {
            for (auto nxt: edges[cur]) {
                if (nxt == par) continue;
                dp2[nxt][i] += total - dp1[nxt][i-2];
            }
        }
    }
    for (auto nxt: edges[cur]) {
        if (nxt == par) continue;
        dfs2(edges, dp1, dp2, nxt, cur);
    }
}

int main() {
    cin >> n;

    vector<vector<int>> edges(n);
    for (int i = 0; i < n-1; ++i) {
        int a, b;
        cin >> a >> b;
        a--; b--;
        edges[a].push_back(b);
        edges[b].push_back(a);
    }

    vector<vector<int64_t>> dp1(n, vector<int64_t>(n));
    vector<vector<int64_t>> dp2(n, vector<int64_t>(n));
    dp2[0][0] = 1;
    vector<int> par(n);
    dfs1(edges, dp1, par, 0, -1);
    dfs2(edges, dp1, dp2, 0, -1);

    /*for (int i = 0; i < n; ++i) {
        cout << i << ": ";
        for (int d = 0; d < n; ++d) {
            cout << dp1[i][d] << ' ';
        }
        cout << '\n';

    }

    for (int i = 0; i < n; ++i) {
        cout << i << ": ";
        for (int d = 0; d < n; ++d) {
            cout << dp2[i][d] << ' ';
        }
        cout << '\n';
    }*/

    for (int d = 1; d < n; ++d) {
        if (d % 2 != 0) {
            cout << "0 ";
            continue;
        } 
        int64_t triples = 0;
        for (int i = 0; i < n; ++i) {
            vector<int64_t> bar1(edges[i].size());
            vector<int64_t> bar2(edges[i].size());
            vector<int64_t> bar3(edges[i].size());
            bar3[0] = 0;
            bar2[0] = 0;
            if (edges[i][0] == par[i]) {
                bar1[0] = dp2[i][d/2];
            } else {
                bar1[0] = dp1[edges[i][0]][d/2-1];
            }
            for (int j = 1; j < (int)edges[i].size(); ++j) {
                if (edges[i][j] == par[i]) {
                    bar3[j] = bar3[j-1] + bar2[j-1]*dp2[i][d/2];
                    bar2[j] = bar2[j-1] + bar1[j-1]*dp2[i][d/2];
                    bar1[j] = bar1[j-1] + dp2[i][d/2];
                } else {
                    bar3[j] = bar3[j-1] + bar2[j-1]*dp1[edges[i][j]][d/2-1];
                    bar2[j] = bar2[j-1] + bar1[j-1]*dp1[edges[i][j]][d/2-1];
                    bar1[j] = bar1[j-1] + dp1[edges[i][j]][d/2-1];
                }
            }
            triples += bar3[edges[i].size()-1];
        }
        cout << triples << ' ';
    }
    cout << '\n';
    
    return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
694
141 214
214 505
141 339
339 180
...

correct output
0 1301 0 12977 0 76694 0 21315...

user output
0 1301 0 12977 0 76694 0 21315...

Test 2

Verdict: ACCEPTED

input
928
534 15
15 364
364 66
364 726
...

correct output
0 1852 0 23152 0 157299 0 4823...

user output
0 1852 0 23152 0 157299 0 4823...

Test 3

Verdict: ACCEPTED

input
2925
2093 1182
2093 2577
1182 2213
2213 1630
...

correct output
0 5201 0 61916 0 512021 0 2340...

user output
0 5201 0 61916 0 512021 0 2340...

Test 4

Verdict: ACCEPTED

input
3198
660 2400
660 2620
2620 3008
2400 179
...

correct output
0 6434 0 102245 0 1122654 0 46...

user output
0 6434 0 102245 0 1122654 0 46...

Test 5

Verdict: ACCEPTED

input
869
142 549
142 335
142 684
549 409
...

correct output
0 1604 0 11624 0 56768 0 17500...

user output
0 1604 0 11624 0 56768 0 17500...

Test 6

Verdict: ACCEPTED

input
1514
904 557
557 957
957 754
904 250
...

correct output
0 3202 0 33876 0 243297 0 9322...

user output
0 3202 0 33876 0 243297 0 9322...

Test 7

Verdict: ACCEPTED

input
2133
1166 813
1166 751
813 416
1166 1743
...

correct output
0 4720 0 75657 0 705952 0 2953...

user output
0 4720 0 75657 0 705952 0 2953...

Test 8

Verdict: ACCEPTED

input
1833
1368 837
837 1296
1296 481
1296 548
...

correct output
0 3365 0 44752 0 313240 0 1147...

user output
0 3365 0 44752 0 313240 0 1147...

Test 9

Verdict: ACCEPTED

input
3446
3060 2907
2907 1089
1089 3155
3060 444
...

correct output
0 7068 0 80352 0 602995 0 3052...

user output
0 7068 0 80352 0 602995 0 3052...

Test 10

Verdict: ACCEPTED

input
55
28 23
23 43
43 41
28 48
...

correct output
0 70 0 262 0 97 0 35 0 12 0 0 ...

user output
0 70 0 262 0 97 0 35 0 12 0 0 ...

Test 11

Verdict: ACCEPTED

input
4000
3717 1739
3717 2875
3717 598
2875 3860
...

correct output
0 8708 0 147350 0 1310042 0 60...

user output
0 8708 0 147350 0 1310042 0 60...

Test 12

Verdict: ACCEPTED

input
4000
2607 3595
2607 3401
3401 1971
3401 3641
...

correct output
0 7518 0 95122 0 775490 0 4259...

user output
0 7518 0 95122 0 775490 0 4259...

Test 13

Verdict: ACCEPTED

input
4000
337 3391
337 783
337 721
337 2376
...

correct output
0 7128 0 86950 0 781051 0 4647...

user output
0 7128 0 86950 0 781051 0 4647...

Test 14

Verdict: ACCEPTED

input
4000
740 1571
740 1104
1104 2145
2145 3441
...

correct output
0 8699 0 169586 0 2358841 0 13...

user output
0 8699 0 169586 0 2358841 0 13...

Test 15

Verdict: ACCEPTED

input
4000
878 154
878 2194
2194 2037
2194 893
...

correct output
0 7747 0 101093 0 954212 0 646...

user output
0 7747 0 101093 0 954212 0 646...

Test 16

Verdict: ACCEPTED

input
4000
1739 685
1739 424
1739 743
1739 2656
...

correct output
0 10650673999 0 0 0 0 0 0 0 0 ...

user output
0 10650673999 0 0 0 0 0 0 0 0 ...

Test 17

Verdict: ACCEPTED

input
4000
2508 3693
2508 2165
2508 1689
3693 1935
...

correct output
0 1337338368 0 184329476 0 198...

user output
0 1337338368 0 184329476 0 198...

Test 18

Verdict: ACCEPTED

input
4000
813 3566
813 2763
813 1541
813 1762
...

correct output
0 426275345 0 2043667310 0 0 0...

user output
0 426275345 0 2043667310 0 0 0...

Test 19

Verdict: ACCEPTED

input
4000
725 282
725 365
725 3660
282 3202
...

correct output
0 666208836 0 972188838 0 0 0 ...

user output
0 666208836 0 972188838 0 0 0 ...

Test 20

Verdict: ACCEPTED

input
4000
1579 3029
1579 891
3029 2534
891 257
...

correct output
0 1184481790 0 0 0 0 0 0 0 0 0...

user output
0 1184481790 0 0 0 0 0 0 0 0 0...

Test 21

Verdict: ACCEPTED

input
4000
1996 520
1996 1978
1996 2196
1978 2182
...

correct output
0 1184359951 0 2360565396 0 0 ...

user output
0 1184359951 0 2360565396 0 0 ...

Test 22

Verdict: ACCEPTED

input
4000
1518 2792
1518 1956
1518 1572
2792 3898
...

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

user output
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ...

Test 23

Verdict: ACCEPTED

input
4000
2266 1993
2266 2140
2266 2230
2266 866
...

correct output
0 4 0 4 0 4 0 4 0 4 0 4 0 4 0 ...

user output
0 4 0 4 0 4 0 4 0 4 0 4 0 4 0 ...

Test 24

Verdict: ACCEPTED

input
4000
3923 1832
3923 1341
3923 856
3923 1130
...

correct output
0 10 0 10 0 10 0 10 0 10 0 10 ...

user output
0 10 0 10 0 10 0 10 0 10 0 10 ...

Test 25

Verdict: ACCEPTED

input
4000
103 2255
103 24
103 2124
103 535
...

correct output
0 1556 0 39 0 1 0 0 0 0 0 0 0 ...

user output
0 1556 0 39 0 1 0 0 0 0 0 0 0 ...

Test 26

Verdict: ACCEPTED

input
4000
1271 1635
1271 3388
1271 3452
1271 3371
...

correct output
0 2780 0 32 0 0 0 0 0 0 0 0 0 ...

user output
0 2780 0 32 0 0 0 0 0 0 0 0 0 ...

Test 27

Verdict: ACCEPTED

input
4000
257 1671
257 2439
257 756
257 1393
...

correct output
0 1406 0 56 0 4 0 0 0 0 0 0 0 ...

user output
0 1406 0 56 0 4 0 0 0 0 0 0 0 ...

Test 28

Verdict: ACCEPTED

input
4000
3694 1140
3694 1224
3694 1601
3694 3050
...

correct output
0 1570 0 83 0 15 0 2 0 0 0 0 0...

user output
0 1570 0 83 0 15 0 2 0 0 0 0 0...

Test 29

Verdict: ACCEPTED

input
4000
1449 2360
1449 611
1449 2332
1449 830
...

correct output
0 2504 0 43 0 1 0 0 0 0 0 0 0 ...

user output
0 2504 0 43 0 1 0 0 0 0 0 0 0 ...

Test 30

Verdict: ACCEPTED

input
4000
2519 595
2519 1119
2519 500
2519 2127
...

correct output
0 2250 0 54 0 0 0 0 0 0 0 0 0 ...

user output
0 2250 0 54 0 0 0 0 0 0 0 0 0 ...

Test 31

Verdict: ACCEPTED

input
4000
2787 2780
2787 3471
2787 206
2787 2050
...

correct output
0 1565 0 90 0 1 0 0 0 0 0 0 0 ...

user output
0 1565 0 90 0 1 0 0 0 0 0 0 0 ...

Test 32

Verdict: ACCEPTED

input
4000
1977 2196
1977 1810
1977 128
1977 436
...

correct output
0 1536 0 67 0 6 0 0 0 0 0 0 0 ...

user output
0 1536 0 67 0 6 0 0 0 0 0 0 0 ...

Test 33

Verdict: ACCEPTED

input
4000
3377 1793
3377 2977
3377 711
3377 2184
...

correct output
0 2524 0 36 0 3 0 0 0 0 0 0 0 ...

user output
0 2524 0 36 0 3 0 0 0 0 0 0 0 ...

Test 34

Verdict: ACCEPTED

input
4000
3617 2852
3617 3552
3617 2064
3617 88
...

correct output
0 2492 0 37 0 0 0 0 0 0 0 0 0 ...

user output
0 2492 0 37 0 0 0 0 0 0 0 0 0 ...

Test 35

Verdict: ACCEPTED

input
4000
2713 1183
2713 565
2713 1432
2713 2859
...

correct output
0 1370 0 99 0 4 0 38 0 0 0 0 0...

user output
0 1370 0 99 0 4 0 38 0 0 0 0 0...

Test 36

Verdict: ACCEPTED

input
4000
3350 3568
3350 968
3350 3110
3350 149
...

correct output
0 2026 0 49 0 45 0 12 0 0 0 0 ...

user output
0 2026 0 49 0 45 0 12 0 0 0 0 ...

Test 37

Verdict: ACCEPTED

input
4000
1794 1797
1794 355
1794 728
1794 2107
...

correct output
0 2240 0 53 0 1 0 0 0 0 0 0 0 ...

user output
0 2240 0 53 0 1 0 0 0 0 0 0 0 ...

Test 38

Verdict: ACCEPTED

input
4000
1571 2107
1571 1258
1571 1808
1571 1754
...

correct output
0 1765 0 51 0 4 0 0 0 0 0 0 0 ...

user output
0 1765 0 51 0 4 0 0 0 0 0 0 0 ...

Test 39

Verdict: ACCEPTED

input
4000
2132 1514
2132 3357
2132 355
2132 3958
...

correct output
0 1991 0 34 0 12 0 0 0 0 0 0 0...

user output
0 1991 0 34 0 12 0 0 0 0 0 0 0...

Test 40

Verdict: ACCEPTED

input
4000
1621 743
1621 1182
1621 1598
1621 2693
...

correct output
0 2500 0 22 0 2 0 0 0 0 0 0 0 ...

user output
0 2500 0 22 0 2 0 0 0 0 0 0 0 ...