제출 #1268114

#제출 시각아이디문제언어결과실행 시간메모리
1268114ducdevRailway (BOI17_railway)C++17
7 / 100
40 ms22856 KiB
// Author: 4uckd3v - Nguyen Cao Duc
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int MAX_N = 1e5;
const int MOD = 1e9 + 7;

int n, q, k, timer, lg;
int edge[MAX_N + 5], tin[MAX_N + 5], tout[MAX_N + 5], dp[MAX_N + 5];
bool ok[MAX_N + 5];
int up[MAX_N + 5][18];
vector<int> adj[MAX_N + 5];

void dfs(int u, int par) {
    tin[u] = ++timer;
    up[u][0] = par;

    for (int i = 1; i <= lg; i++) up[u][i] = up[up[u][i - 1]][i - 1];

    for (int id : adj[u]) {
        int v = edge[id] ^ u;
        if (v == par) continue;
        dfs(v, u);
    };

    tout[u] = ++timer;
};

bool isAncestor(int u, int v) {
    return tin[u] <= tin[v] && tout[u] >= tout[v];
};

int __lca(int u, int v) {
    if (isAncestor(u, v)) return u;
    if (isAncestor(v, u)) return v;

    for (int i = lg; i >= 0; i--)
        if (!isAncestor(up[u][i], v))
            u = up[u][i];

    return up[u][0];
};

void calc(int u, int par) {
    for (int id : adj[u]) {
        int v = edge[id] ^ u;
        if (v == par) continue;
        calc(v, u);
        dp[u] += dp[v];
        if (dp[v] >= 2 * k) ok[id] = true;
    };
};

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if (fopen("MAIN.INP", "r")) {
        freopen("MAIN.INP", "r", stdin);
        freopen("MAIN.OUT", "w", stdout);
    };

    cin >> n >> q >> k;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(i);
        adj[v].push_back(i);
        edge[i] = u ^ v;
    };

    lg = ceil(log2(n));
    dfs(1, 1);

    while (q--) {
        int sz;
        cin >> sz;
        vector<int> vertex(sz);
        for (int &u : vertex) cin >> u;

        sort(vertex.begin(), vertex.end(), [&](int u, int v) {
            return tin[u] < tin[v];
        });

        if (sz == 1) continue;

        vertex.push_back(__lca(vertex[0], vertex[sz - 1]));

        for (int i = 0; i < sz; i++) {
            int u = vertex[i], v = vertex[i + 1];
            int lca = __lca(u, v);
            dp[u]++, dp[v]++;
            dp[lca] -= 2;
        };
    };

    calc(1, 1);

    cout << accumulate(ok + 1, ok + n, 0) << '\n';
    for (int i = 1; i < n; i++)
        if (ok[i]) cout << i << ' ';
};

컴파일 시 표준 에러 (stderr) 메시지

railway.cpp: In function 'int main()':
railway.cpp:60:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |         freopen("MAIN.INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
railway.cpp:61:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |         freopen("MAIN.OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...