Submission #869450

#TimeUsernameProblemLanguageResultExecution timeMemory
869450AndreiBOTOToll (BOI17_toll)C++14
100 / 100
126 ms19828 KiB
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

const int NMAX=5e4+5;
const int INF=1e9;
const int KMAX=6;

vector<pair<int,int>>v[NMAX];

int dpst[NMAX][KMAX][KMAX];
int dpdr[NMAX][KMAX][KMAX];
int rez[NMAX];

int n,k;

struct elem{
    int st;
    int dr;
    int ind;
};
vector<elem>query[NMAX];

void divide(int st,int dr)
{
    int i,j;
    if(st==dr)
    {
        for(auto i:query[st])
            if(i.dr/k==st && i.st==i.dr)
                rez[i.ind]=0;
        return ;
    }
    else
    {
        int mij=st+dr;
        mij/=2;
        divide(st,mij);
        divide(mij+1,dr);
        for(int bucket=st;bucket<=mij;bucket++)
            for(i=0;i<k;i++)
                for(j=0;j<k;j++)
                    dpst[bucket][i][j]=INF;
        for(int bucket=dr;bucket>=mij;bucket--)
            for(i=0;i<k;i++)
                for(j=0;j<k;j++)
                    dpdr[bucket][i][j]=INF;
        for(i=0;i<k;i++)
            dpst[mij][i][i]=dpdr[mij][i][i]=0;
        ///dpst-> mij....st
        ///dpdr-> mij....dr
        for(int bucket=mij;bucket<dr;bucket++)
        {
            for(i=0;i<k;i++)
                for(j=0;j<k;j++)
                    for(auto edge:v[bucket*k+j])
                    {
                        dpdr[bucket+1][i][edge.first%k]=min(dpdr[bucket+1][i][edge.first%k],
                        dpdr[bucket][i][j]+edge.second);
                    }
        }
        for(int bucket=mij-1;bucket>=st;bucket--)
        {
            for(i=0;i<k;i++)
                for(j=0;j<k;j++)
                    for(auto edge:v[bucket*k+j])
                    {
                        dpst[bucket][i][j]=min(dpst[bucket][i][j],
                        dpst[bucket+1][i][edge.first%k]+edge.second);
                    }
        }
        for(i=st;i<=mij;i++)
            for(auto j:query[i])
                if(j.dr/k<=dr && j.dr/k>mij)
                    for(int lup=0;lup<k;lup++)
                        rez[j.ind]=min(rez[j.ind],dpst[i][lup][j.st%k]+dpdr[j.dr/k][lup][j.dr%k]);
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int m,o,i,j;
    cin>>k>>n>>m>>o;
    for(i=1;i<=m;i++)
    {
        int x,y,c;
        cin>>x>>y>>c;
        v[x].push_back(make_pair(y,c));
    }
    for(i=1;i<=o;i++)
    {
        int x,y;
        cin>>x>>y;
        query[x/k].push_back({x,y,i});
        rez[i]=INF;
    }
    divide(0,n/k);
    for(i=1;i<=o;i++)
        if(rez[i]==INF)
            cout<<-1<<"\n";
        else
            cout<<rez[i]<<"\n";
    return 0;
}

Compilation message (stderr)

toll.cpp:3: warning: ignoring '#pragma optimize GCC' [-Wunknown-pragmas]
    3 | #pragma optimize GCC ("Ofast")
      | 
toll.cpp: In function 'int main()':
toll.cpp:93:15: warning: unused variable 'j' [-Wunused-variable]
   93 |     int m,o,i,j;
      |               ^
#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...