Submission #1181946

#TimeUsernameProblemLanguageResultExecution timeMemory
1181946dpsaveslivesWells (CEOI21_wells)C11
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
#define For(i,l,r) for(register int i=(l);i<=(r);++i)
#define For_down(i,r,l) for(register int i=(r);i>=(l);--i)
using namespace std;
constexpr int n_MAX = 1500000 + 5, mod = 1000000007;
int norm(const int x) {
    return ((x >= mod) ? (x - mod) : x);
}
void add(int &x, const int y) {
    (((x += y) >= mod) && (x -= mod));
}
int mul(const int x, const int y) {
    return (((long long)x * y) % mod);
}
int n, k, p, q, diam, Fa[n_MAX], dep[n_MAX], dis[n_MAX], other[n_MAX], project[n_MAX], h[n_MAX], side[n_MAX],
    equ_class[n_MAX];
vector<int> A[n_MAX], ch[n_MAX], path;
void DFS(const int u, int dis[]) {
    for (const int v : A[u])
        if (v != Fa[u])
            Fa[v] = u, dis[v] = (dis[u] + 1), DFS(v, dis);
}
int max_element() {
    return (max_element(dis + 1, dis + n + 1) - dis);
}
void DFS2(const int u) {
    for (const int v : A[u])
        if (!project[v])
            Fa[v] = u, dep[v] = (dep[u] + 1), project[v] = project[u], DFS2(v), h[u] = max(h[u], h[v] + 1);
}
int tag[n_MAX];
bool ok[2][n_MAX];
int F[n_MAX], mul1[n_MAX], mul2[n_MAX], ans[2][n_MAX];
struct range {
    int l, r;
    bool c;
};
range norm(int l, int r) {
    if (l > r)
        return {0, k - 1, true};

    if ((r - l) >= (k - 1))
        return {0, k - 1};

    l %= k, r %= k;

    if (l <= r)
        return {l, r};
    else
        return {r + 1, l - 1, true};
}
range complement(const range a) {
    return {a.l, a.r, !a.c};
}
void ban(const int l, const int r) {
    if (l <= r)
        ++tag[l], --tag[r + 1];
}
void ban_intersect(range a, range b) {
    if (!a.c && !b.c)
        ban(max(a.l, b.l), min(a.r, b.r));
    else if (a.c && b.c)
        ban(0, min(a.l, b.l) - 1), ban(b.r + 1, a.l - 1), ban(a.r + 1, b.l - 1), ban(max(a.r, b.r) + 1, k - 1);
    else {
        if (a.c)
            swap(a, b);

        ban(a.l, min(a.r, b.l - 1)), ban(max(a.l, b.r + 1), a.r);
    }
}
void ban(const int l1, const int r1, const int l2, const int r2) {
    const range a = norm(l1, r1), b = norm(l2, r2);
    ban_intersect(a, b), ban_intersect(complement(a), complement(b));
}
void ban(const int l, const int r, const int p) {
    ban_intersect(complement(norm(l, r)), {p, p, true});
}
void apply(const int l1, int r1, const int l2, const int r2, const int x) {
    if (l2 == (r1 + 1)) {
        if (r2 < (k - 1))
            mul1[r2 + 1] = mul(mul1[r2 + 1], x);
    } else {
        if ((r2 - l2) >= (k - 1))
            return;

        r1 = max(r1, r2 - k), mul2[r1 + 1] = mul(mul2[r1 + 1], x);

        if (r2 < (k - 1))
            mul1[r2 + 1] = mul(mul1[r2 + 1], x);
    }
}
void DP(const int u) {
    if (!ch[u].empty()) {
        F[u] = 1;

        for (const int v : ch[u])
            DP(v), F[u] = mul(F[u], F[v]);
    }

    if (dis[u] <= (k - 1))
        add(F[u], 1);
}
void DFS3(const int u) {
    const int dis_proj = dis[project[u]], l = (max(dis_proj, (k - 1) >> 1) + 1), r = dis[u], len2 = (r - l + 1),
              len1 = (k - len2);

    if (dep[u] <= (k - 1)) {
        if (dis[u] >= (k - 1))
            ban(dis_proj - len1 + 1, dis_proj, l, r);

        if (other[u] >= (k - 1))
            ban(dis_proj, dis_proj + len1 - 1, l, r);
    }

    for (const int v : ch[u])
        if (side[v] == 1)
            DP(v), apply(0, dis_proj, max(dis_proj, (k - 1) >> 1) + 1, dis[u], F[v]);
        else
            DFS3(v);
}
void DFS4(const int u) {
    int f = 0, s = 0;

    for (const int v : ch[u]) {
        DFS4(v);

        if ((h[v] + 1) > f)
            s = f, f = (h[v] + 1);
        else if ((h[v] + 1) > s)
            s = (h[v] + 1);
    }

    if ((f + s) >= (k - 1)) {
        const int l = min(s, (k - 1) >> 1), r = (k - l - 1);
        ban(max(dis[u] + l, (k - 1) >> 1) + 1, dis[u] + r, equ_class[u]);
    }
}
int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    cin >> n >> k;
    For(i, 1, n - 1) {
        int u, v;
        cin >> u >> v, A[u].push_back(v), A[v].push_back(u);
    }
    DFS(1, dis), p = max_element(), Fa[p] = dis[p] = 0, DFS(p, dis), q = max_element(), Fa[q] = 0, DFS(q, other),
                                            diam = dis[q];

    if (diam < (k - 1)) {
        int ans = 1;
        For(i, 1, n) ans = norm(ans << 1);
        cout << "YES\n" << ans << '\n';
        return 0;
    }

    int u = p;

    while (u)
        side[u] = 2, path.push_back(u), project[u] = u, u = Fa[u];

    For(i, 0, diam) {
        const int u = path[i];
        Fa[u] = dep[u] = 0, DFS2(u);
    }
    int cnt = 0;

    For(i, 1, n) if (!side[i]) {
        side[i] = (((dis[i] + h[i]) >= (k - 1)) + ((other[i] + h[i]) >= (k - 1)));

        if (!side[i])
            ++cnt;
    }

    For(i, 1, n) if (Fa[i] && side[i])
        ch[Fa[i]].push_back(i);

    For(I, 0, 1) {
        memset(tag, 0, k << 2), fill(mul1, mul1 + k, 1), fill(mul2, mul2 + k, 1);

        For(i, 1, n) if (side[i] == 2) {
            if (dep[i] >= ((k - 1) >> 1))
                equ_class[i] = (dis[i] % k);
            else
                equ_class[i] = (-1);
        }

        For_down(i, diam, (diam + I + 1) >> 1) {
            const int u = path[i];
            DFS3(u);

            for (const int v : ch[u])
                DFS4(v);
        }
        For(i, 0, k - 1) {
            if (!tag[i])
                ok[I][i] = true, ans[I][i] = 1;

            tag[i + 1] += tag[i];
        }
        For(i, 0, k - 1) ans[I][i] = mul(ans[I][i], mul1[i]), mul1[i + 1] = mul(mul1[i + 1], mul1[i]);
        For(i, 0, (k - 1) >> 1) ans[I][i] = mul(ans[I][i], mul2[i]), mul2[i + 1] = mul(mul2[i + 1], mul2[i]);
        swap(p, q);
        For(i, 1, n) swap(dis[i], other[i]);
        reverse(path.begin(), path.end());
    }
    bool Flag = false;
    int sum = 0;
    For(i, 0, k - 1) {
        const int j = ((diam - i) % k);
        Flag |= (ok[0][i] && ok[1][j]), add(sum, mul(ans[0][i], ans[1][j]));
    }
    For(i, 1, cnt) sum = norm(sum << 1);

    if (Flag)
        cout << "YES\n" << sum << '\n';
    else
        cout << "NO\n0\n";

    return 0;
}

Compilation message (stderr)

wells.c:1:10: fatal error: bits/stdc++.h: No such file or directory
    1 | #include <bits/stdc++.h>
      |          ^~~~~~~~~~~~~~~
compilation terminated.