53012023-04-25 17:33:10gortomiTestvérvárosokcpp17Hibás válasz 0/1001.575s11564 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int> > > g;
vector<int> d, s, act, to, dep;
long long ans = 0;
int k, c;
vector<bool> w;
void dfs(int n, int p)
{
    s[n] = 1;
    for(auto x : g[n])
    {
        int y = x.first;
        if(y != p && !w[y])
        {
            dfs(y, n);
            s[n] += s[y];
        }
    }
}
int fc(int n, int p)
{
    for(auto x : g[n])
    {
        int y = x.first;
        if(!w[y] && y != p)
        {
            if(s[y] > c / 2) return fc(y, n);
        }
    }
    return n;
}
void add(int n, int p)
{
    ans += dep[(k - d[n]) % k];
    for(auto x : g[n])
    {
        int y = x.first;
        if(!w[y] && y != p)
        {
            d[y] = (d[n] + x.second) % k;
            add(y, n);
        }
    }
}
void solve(int n)
{
    w[n] = 1;
    c = s[n];
    dfs(n, 0);
    int u = fc(n, 0);
    dep[0]++;
    to.clear();
    for(auto x : g[n])
    {
        int y = x.first;
        if(!w[y])
        {
            act.clear();
            d[y] = x.second % k;
            add(y, n);
            for(auto x : act)
            {
                dep[d[x]]++;
            }
        }
    }
    for(auto x : to) dep[d[x]]--;
    dep[0]--;
    for(auto x : g[n])
    {
        int y = x.first;
        if(!w[y]) solve(y);
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n >> k;
    g.resize(n + 1);
    d.resize(n + 1);
    w.resize(n + 1);
    s.resize(n + 1);
    dep.resize(k);
    for(int i = 0; i < n - 1; i++)
    {
        int x, y, w;
        cin >> x >> y >> w;
        g[x].push_back({y, w});
        g[y].push_back({x, w});
    }
    solve(1);
    cout << ans;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1892 KiB
2Hibás válasz3ms2128 KiB
subtask20/15
3Hibás válasz3ms2336 KiB
4Elfogadva3ms2552 KiB
5Hibás válasz4ms2912 KiB
6Hibás válasz4ms3128 KiB
7Hibás válasz4ms3208 KiB
8Elfogadva3ms3156 KiB
9Hibás válasz6ms3512 KiB
subtask30/15
10Hibás válasz187ms5156 KiB
11Elfogadva301ms4384 KiB
12Hibás válasz1.133s10488 KiB
13Hibás válasz1.449s9832 KiB
14Hibás válasz1.32s10364 KiB
subtask40/20
15Elfogadva4ms4096 KiB
16Elfogadva29ms4176 KiB
17Elfogadva1.125s5764 KiB
18Időlimit túllépés1.575s6460 KiB
19Időlimit túllépés1.572s7884 KiB
20Időlimit túllépés1.557s9800 KiB
21Időlimit túllépés1.572s9552 KiB
22Időlimit túllépés1.569s10704 KiB
subtask50/50
23Időlimit túllépés1.569s6808 KiB
24Hibás válasz628ms7956 KiB
25Hibás válasz800ms9056 KiB
26Hibás válasz12ms5868 KiB
27Hibás válasz644ms7956 KiB
28Hibás válasz1.144s11200 KiB
29Hibás válasz949ms10944 KiB
30Hibás válasz1.228s10888 KiB
31Hibás válasz1.294s11564 KiB