Submission #1284357

#TimeUsernameProblemLanguageResultExecution timeMemory
1284357warrennUsmjeri (COCI17_usmjeri)C++20
0 / 140
2100 ms83656 KiB
#include<bits/stdc++.h>
using namespace std; 
#define int long long 
#pragma GCC optimize("O3,unroll-loops")

const int maxn=3e5;
const int mod=1e9+7;

int pang(int a,int b){
    if(b==0)return 1;
    int tmp=pang(a,b/2);
    if(b%2==0)return (tmp*tmp)%mod;
    else return (((tmp*tmp)%mod)*a)%mod;
}

int n,qu;
vector<int>adj[maxn+2];
int bin[maxn+2][20],dep[maxn+2];

void dfs(int cur,int par){
    bin[cur][0]=par;
    dep[cur]=dep[par]+1;

    for(auto x : adj[cur]){
        if(x==par)continue;
        dfs(x,cur);
    }
}

int lca(int u,int v){
    if(dep[u]<dep[v])swap(u,v);
    int slsh=dep[u]-dep[v];

    for(int q=19;q>=0;q--){
        if(slsh>=(1<<q)){
            slsh-=(1<<q);
            u=bin[u][q];
        }
    }

    if(u==v)return u;
    for(int q=19;q>=0;q--){
        if(bin[u][q]!=bin[v][q]){
            u=bin[u][q];
            v=bin[v][q];
        }
    }
    return bin[u][0];
}

int dsu[2*maxn+2];

int fin(int a){
    if(dsu[a]==a)return a;
    return dsu[a]=fin(dsu[a]);
}

void merg(int a,int b){
    a=fin(a); b=fin(b);
    if(a==b)return ;
    dsu[a]=b;
}

int naik[2*maxn+2];

int fin2(int a){
    if(naik[a]==a)return a;
    return naik[a]=fin(naik[a]);
}

void merg2(int a,int b){
    a=fin2(a); b=fin2(b);
    if(a==b)return ;
    if(dep[a]<dep[b])swap(a,b);
    naik[a]=b;
}

signed main(){
    cin>>n>>qu;
    for(int q=1;q<n;q++){
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    for(int q=1;q<=2*n;q++){
        dsu[q]=q;
        naik[q]=q;
    }
    

    dfs(1,0);
    for(int q=1;q<20;q++){
        for(int w=1;w<=n;w++){
            bin[w][q]=bin[bin[w][q-1]][q-1];
        }
    }

    for(int q=1;q<=qu;q++){
        int u,v;
        cin>>u>>v;
        int root=lca(u,v);

        u=fin2(u);
        while(dep[u]-dep[root]>=2){
            merg(u,bin[u][0]);
            merg(u+n,bin[u][0]+n);

            merg2(u,bin[u][0]);
            u=fin2(u);
        }

        v=fin2(v);
        while(dep[v]-dep[root]>=2){
            merg(v,bin[v][0]);
            merg(v+n,bin[v][0]+n);

            merg2(v,bin[v][0]);
            v=fin2(v);
        }

        if(root==u || root==v)continue;
        merg(u,v+n);
        merg(v,u+n);

    }

    
    for(int q=1;q<=n;q++){
        if(fin(q)==fin(n+q)){
            cout<<0<<endl;
            return 0;
        }
    }

    int cc=1;
    for(int q=1;q<=2*n;q++){
        if(fin(q)==q)cc++;
    }
    cc-=2;
    cout<<pang(2,cc/2)<<endl;
}
#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...