Submission #577598

#TimeUsernameProblemLanguageResultExecution timeMemory
577598saarang123Usmjeri (COCI17_usmjeri)C++17
140 / 140
445 ms87052 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MXN = 300 * 1000 + 3;
const int LGN = 19, mod = 1e9 + 7;
vector<int> g[MXN];
vector<array<int, 2>> adj[MXN];
int dt[MXN], cmin[MXN], sub[MXN], up[MXN][LGN], col[MXN];
int n, m;

void init(int v = 1, int p = 0) {
    for(int i = 1; i < LGN; i++)
        up[v][i] = up[up[v][i - 1]][i - 1];

    for(int u : g[v]) if(u != p) {
        up[u][0] = v;
        dt[u] = dt[v] + 1;
        cmin[u] = dt[u];
        init(u, v);
    }
}

int kth(int v, int k) {
    for(int i = 0; i < LGN; i++)
        if(k >> i & 1)
            v = up[v][i];
    return v;
}

int LCA(int u, int v) {
    if(dt[u] > dt[v])
        swap(u, v);
    v = kth(v, dt[v] - dt[u]);
    if(u == v)
        return v;
    for(int i = LGN - 1; i >= 0; i--)
        if(up[u][i] != up[v][i])
            u = up[u][i], v = up[v][i];
    return up[u][0];
}

int connect(int v = 1, int p = 1) {
    sub[v] = cmin[v];
    for(int u : g[v]) if(u != p) {
        sub[v] = min(sub[v], connect(u, v));
        if(sub[u] < dt[v]) {
            adj[u].push_back({v, 0});
            adj[v].push_back({u, 0});
        }
    }
    return sub[v];
}

bool dfs(int v, int c) {
    col[v] = c;
    for(auto &[u, i] : adj[v]) {
        if(col[u] != -1 && col[u] != (c ^ i))
            return false;
        else if(col[u] == -1)
            if(!dfs(u, c ^ i))
                return false;
    }
    return true;
}

ll fexpo(ll a, int b) {
    ll res = 1;
    while(b) {
        if(b & 1)
            (res *= a) %= mod;
        (a *= a) %= mod;
        b >>= 1;
    }
    return res;
}

int main() {
    std::ios::sync_with_stdio(0);
    std::cin.tie(0);
    cin >> n >> m;
    memset(col, -1, sizeof col);
    for(int u, v, i = 1; i < n; i++) {
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    init();
    for(int u, v, i = 0; i < m; i++) {
        cin >> u >> v; 
        int lc = LCA(u, v);
        //cout << u << ' ' << v << ": " << lc << endl;
        for(int x : {u, v})
            cmin[x] = min(cmin[x], dt[lc]);
        if(u != lc && v != lc) {
            adj[u].push_back({v, 1});
            adj[v].push_back({u, 1});
        }
    }
    connect();
    int cnt = 0;
    for(int i = 2; i <= n; i++) if(col[i] < 0) {
        if(!dfs(i, 0))
            return cout << 0 << '\n', 0;
        cnt++;
    }
    cout << fexpo(2LL, cnt) << '\n';
    return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...