제출 #667643

#제출 시각아이디문제언어결과실행 시간메모리
667643berrStar Trek (CEOI20_startrek)C++17
30 / 100
64 ms11440 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+37;
vector<int> adj[N], adj2[N];
int huh, huuh, mod=1e9+7;
int st[N][2], ans=0;
int mul(int x, int y){
    return (x*y)%mod;
}

int sum(int x, int y){
    return((x+y)%mod+mod)%mod;
}
int poww(int x, int y)
{
    if(y==0) return 1;
    int tmp=poww(x, y/2);

    if(y%2) return mul(tmp, mul(tmp, x));
    return mul(tmp, tmp); 
}

int dfs2(int v, int p, int d)
{
    int f=1;

    if(d%2==0) f=0;

    int count=0, val=0;

    for(auto i: adj2[v])
    {
        if(i==p) continue;

        if(dfs2(i, v, d+1))
        {
         
            if(d%2==0){
                f=1;
            }
        }
        else
        {
            if(d%2) f=0;
        }
    }


    return f;
}


int dfs(int v, int p, int d)
{
    int f=1;

    if(d%2==0) f=0;

    for(auto i: adj[v])
    {
        if(i==p) continue;

        if(dfs(i, v, d+1))
        {
            if(d%2==0){
                f=1;
            }
        }
        else
        {
            if(d%2) f=0;
        }
    }

    if(huh==v)
    {   
        if(st[huuh][((d+1)%2+2)%2]) 
        {
            if(d%2==0) f=1;
        }
        else
        {
            if(d%2) f=0;
        }
    }


    return f;
}


signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n, d; cin>>n>>d;


    for(int i=0; i<n-1; i++){
        int x, y; cin>>x>>y;

        adj[x].push_back(y);
        adj[y].push_back(x);

        adj2[x].push_back(y);
        adj2[y].push_back(x);
    }

    int ans=0;

    if(d>1)
    {
        cout<<poww(4, d);

    }

    else if(n<=1e4)
    {
        for(int i=1; i<=n; i++)
        {
            st[i][0]=dfs2(i, 0, 0);
            st[i][1]=dfs2(i, 0, 1);

        }

        int x=-1, y=-1, allx=0, ally=0;
        for(int i=1; i<=n; i++){
            if(st[i][0]) x=i, allx++;
            if(st[i][1]) y=i, ally++;
        }

        for(int i=1; i<=n; i++)
        {
            if(x!=-1){
                huh=i;
                huuh=x;

                if(dfs(1, 0, 0)) ans=sum(ans, allx);
            }
            if(y!=-1)
            {
                huh=i;
                huuh=y;
                if(dfs(1, 0, 0)) ans=sum(ans, ally);

            }

        }
        cout<<ans;

    }

   


}

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

startrek.cpp: In function 'long long int dfs2(long long int, long long int, long long int)':
startrek.cpp:30:9: warning: unused variable 'count' [-Wunused-variable]
   30 |     int count=0, val=0;
      |         ^~~~~
startrek.cpp:30:18: warning: unused variable 'val' [-Wunused-variable]
   30 |     int count=0, val=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...