Submission #18630

#TimeUsernameProblemLanguageResultExecution timeMemory
18630ggohTropical Garden (IOI11_garden)C++98
100 / 100
2725 ms11892 KiB
#include "garden.h"
#include "gardenlib.h"
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
#include<vector>
int a,b,c,t,h,p,q,check,p1,q1,y,z,sz1,sz2,v[150003][2],ch2[150003][2],ch1[150003][2],x[150003][2],D1[150003][2],D2[150003][2],cycle1[150003][2],cycle2[150003][2];
void count_routes(int N,int M,int P,int R[][2],int Q,int G[])
{
    a=N;b=M;
    c=P+1;
    for(int i=0;i<b;i++)
    {
        if(x[R[i][0]+1][0]==0)x[R[i][0]+1][0]=R[i][1]+1;
        else if(x[R[i][0]+1][1]==0)x[R[i][0]+1][1]=R[i][1]+1;
        if(x[R[i][1]+1][0]==0)x[R[i][1]+1][0]=R[i][0]+1;
        else if(x[R[i][1]+1][1]==0)x[R[i][1]+1][1]=R[i][0]+1;
    }
    for(int i=1;i<=a;i++)
    {
        if(x[i][1]==0)x[i][1]=x[i][0];
    }
    p=c;q=0;t=0;
    D1[p][q]=0;
    ch1[p][q]=1;

    v[p][q]=1;
    p1=-1;q1=-1;
    while(1)
    {
        if(q==0)p1=x[p][0];
        else p1=x[p][1];
        if(p==x[p1][0])q1=1;
        else q1=0;
        if(p1==c&&q1==0)break;
        else
        {
            if(v[p1][q1]==1)break;
            v[p1][q1]=1;
            p=p1;q=q1;
            t++;
        }
    }
    if(p1==c&&q1==0)
    {
        p=c;q=0;
        cycle1[p][q]=t+1;
        while(1)
        {
            if(q==0)p1=x[p][0];
            else p1=x[p][1];
            if(p==x[p1][0])q1=1;
            else q1=0;
            if(p1==c&&q1==0)break;
            p=p1;q=q1;
            ch1[p][q]=1;
            D1[p][q]=t;t--;
            cycle1[p][q]=cycle1[c][0];
        }
    }
    memset(v,0,sizeof(v));

    p=c;q=1;t=0;
    D2[p][q]=0;
    ch2[p][q]=1;

    v[p][q]=1;
    p1=-1;q1=-1;
    while(1)
    {
        if(q==0)p1=x[p][0];
        else p1=x[p][1];
        if(p==x[p1][0])q1=1;
        else q1=0;
        if(p1==c&&q1==1)break;
        else
        {
            if(v[p1][q1]==1)break;
            v[p1][q1]=1;
            p=p1;q=q1;
            t++;
        }
    }
    if(p1==c&&q1==1)
    {
        p=c;q=1;
        cycle2[p][q]=t+1;
        while(1)
        {
            if(q==0)p1=x[p][0];
            else p1=x[p][1];
            if(p==x[p1][0])q1=1;
            else q1=0;
            if(p1==c&&q1==1)break;
            p=p1;q=q1;
            ch2[p][q]=1;
            D2[p][q]=t;
            cycle2[p][q]=cycle2[c][1];
            t--;
        }
    }

    memset(v,0,sizeof(v));
    for(int i=1;i<=a;i++)
    {
        for(int j=0;j<2;j++)
        {
            if(ch1[i][j])continue;
            p=i;q=j;t=0;
            v[i][j]=1;
            while(1)
            {
                if(q==0)p1=x[p][0];
                else p1=x[p][1];
                if(p==x[p1][0])q1=1;
                else q1=0;
                t++;
                if(ch1[p1][q1])break;
                else if(v[p1][q1])break;
                p=p1;q=q1;
                v[p][q]=1;
            }
            if(ch1[p1][q1])
            {
                y=p1;z=q1;
                p=i;q=j;
                ch1[p][q]=1;
                D1[p][q]=D1[y][z]+t;
                cycle1[p][q]=cycle1[y][z];
                while(1)
                {
                    if(q==0)p1=x[p][0];
                    else p1=x[p][1];
                    if(p==x[p1][0])q1=1;
                    else q1=0;
                    t--;
                    if(p1==y&&q1==z)break;
                    p=p1;q=q1;
                    ch1[p][q]=1;
                    D1[p][q]=D1[y][z]+t;
                    cycle1[p][q]=cycle1[y][z];
                }
            }
        }
    }
    memset(v,0,sizeof(v));
    for(int i=1;i<=a;i++)
    {
        for(int j=0;j<2;j++)
        {
            if(ch2[i][j])continue;
            p=i;q=j;t=0;
            v[i][j]=1;
            while(1)
            {
                if(q==0)p1=x[p][0];
                else p1=x[p][1];
                if(p==x[p1][0])q1=1;
                else q1=0;
                t++;
                if(ch2[p1][q1])break;
                else if(v[p1][q1])break;
                p=p1;q=q1;
                v[p][q]=1;
            }
            if(ch2[p1][q1])
            {
                y=p1;z=q1;
                p=i;q=j;
                ch2[p][q]=1;
                D2[p][q]=D2[y][z]+t;
                cycle2[p][q]=cycle2[y][z];
                while(1)
                {
                    if(q==0)p1=x[p][0];
                    else p1=x[p][1];
                    if(p==x[p1][0])q1=1;
                    else q1=0;
                    t--;
                    if(p1==y&&q1==z)break;
                    p=p1;q=q1;
                    ch2[p][q]=1;
                    D2[p][q]=D2[y][z]+t;
                    cycle2[p][q]=cycle2[y][z];
                }
            }
        }
    }
    int ans;
    for(int i=0;i<Q;i++)
    {
        ans=0;
        for(int j=1;j<=a;j++)
        {
            if(ch1[j][0]&&(D1[j][0]==G[i]||(cycle1[j][0]&&G[i]>D1[j][0]&&(G[i]-D1[j][0])%cycle1[j][0]==0)))
            {
                ans++;
            }
            else if(ch2[j][0]&&(D2[j][0]==G[i]||(cycle2[j][0]&&G[i]>D2[j][0]&&(G[i]-D2[j][0])%cycle2[j][0]==0)))
            {
                ans++;
            }
        }
        answer(ans);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...