Submission #213629

#TimeUsernameProblemLanguageResultExecution timeMemory
213629MKopchevToll (BOI17_toll)C++14
100 / 100
160 ms101624 KiB
#include<bits/stdc++.h>
using namespace std;
const int nmax=5e4+42;

int k,n,m,q;

int dist[20][nmax][5][5];

int dist_1[5][5],dist_2[5][5],dist_3[5][5];

void my_merge()
{
    memset(dist_3,-1,sizeof(dist_3));
    for(int i=0;i<k;i++)
        for(int j=0;j<k;j++)
            for(int p=0;p<k;p++)
                if(dist_1[i][j]!=-1&&dist_2[j][p]!=-1)
                {
                    int is=dist_1[i][j]+dist_2[j][p];
                    if(dist_3[i][p]==-1)dist_3[i][p]=is;
                    else dist_3[i][p]=min(dist_3[i][p],is);
                }

}

int current_dists[5],help[5];

int query()
{
    int u,v;
    scanf("%i%i",&u,&v);

    memset(current_dists,-1,sizeof(current_dists));
    current_dists[u%k]=0;

    int beg=u/k,en=v/k;
    for(int step=19;step>=0;step--)
        if(beg+(1<<step)<=en)
        {
            memset(help,-1,sizeof(help));

            for(int j=0;j<k;j++)
                for(int p=0;p<k;p++)
                    if(current_dists[j]!=-1&&dist[step][beg][j][p]!=-1)
                    {
                        int is=current_dists[j]+dist[step][beg][j][p];
                        if(help[p]==-1)help[p]=is;
                        else help[p]=min(help[p],is);
                    }
            for(int j=0;j<k;j++)
                current_dists[j]=help[j];

            beg=beg+(1<<step);
        }
    return current_dists[v%k];
}
int main()
{
    memset(dist,-1,sizeof(dist));
    scanf("%i%i%i%i",&k,&n,&m,&q);

    int a,b,t;
    for(int i=1;i<=m;i++)
    {
        scanf("%i%i%i",&a,&b,&t);
        dist[0][a/k][a%k][b%k]=t;
    }

    for(int step=1;step<20;step++)
    {
        for(int i=0;i+(1<<step)-1<=n/k;i++)
        {
            for(int j=0;j<k;j++)
                for(int p=0;p<k;p++)
                {
                    dist_1[j][p]=dist[step-1][i][j][p];
                    dist_2[j][p]=dist[step-1][i+(1<<(step-1))][j][p];
                }

            my_merge();

            for(int j=0;j<k;j++)
                for(int p=0;p<k;p++)
                    dist[step][i][j][p]=dist_3[j][p];
        }
    }

    for(int i=1;i<=q;i++)
        printf("%i\n",query());
    return 0;
}

Compilation message (stderr)

toll.cpp: In function 'int query()':
toll.cpp:31:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%i%i",&u,&v);
     ~~~~~^~~~~~~~~~~~~~
toll.cpp: In function 'int main()':
toll.cpp:60:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%i%i%i%i",&k,&n,&m,&q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:65:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%i%i%i",&a,&b,&t);
         ~~~~~^~~~~~~~~~~~~~~~~~~
#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...