Submission #423010

#TimeUsernameProblemLanguageResultExecution timeMemory
423010blueToll (BOI17_toll)C++17
100 / 100
390 ms19256 KiB
#include <iostream>
#include <vector>
using namespace std;

const int maxN = 50000;
const int maxK = 5;
const int INF = 1e9;
const int no_ranges_used = -1;

//mod, cities, edges, orders
int K, N, M, O;

vector<int> edge[maxN];
vector<int> wt[maxN];

int X[maxK];
int curr_r = no_ranges_used;
vector< vector<int> > sample_mindist;

struct segtree
{
    int l; //l and r are over [i/K]
    int r;

    vector< vector<int> > minDist = sample_mindist;

    segtree* left = NULL;
    segtree* right = NULL;

    segtree()
    {
        ;
    }

    segtree(int L, int R)
    {
        l = L;
        r = R;

        if(l == r)
        {
            for(int m = 0; m < K; m++)
                minDist[m][m] = 0;
        }
        else
        {
            int m = (l+r)/2;
            left = new segtree(l, m);
            right = new segtree(m+1, r);

            for(int a = K*m; a < K*(m+1); a++)
            {
                for(int i = 0; i < edge[a].size(); i++)
                {
                    int b = edge[a][i];
                    int t = wt[a][i];

                    for(int m1 = 0; m1 < K; m1++)
                    {
                        for(int m2 = 0; m2 < K; m2++)
                        {
                            minDist[m1][m2] = min(minDist[m1][m2], left->minDist[m1][a%K] + t + right->minDist[b%K][m2]);
                        }
                    }
                }
            }
        }
    }

    void query(int A, int B) //ans is in X[B % K]
    {
        if(l == 0/K && r == (N-1)/K)
        {
            curr_r = no_ranges_used;
        }

        if(B/K < l || r < A/K) return;
        else if(A/K <= l && r <= B/K)
        {
            if(curr_r == no_ranges_used)
            {
                for(int m = 0; m < K; m++)
                {
                    X[m] = minDist[A%K][m];
                }
            }
            else
            {
                vector<int> Y(K, INF);

                for(int a = K*(l-1); a < K*l; a++)
                {
                    for(int i = 0; i < edge[a].size(); i++)
                    {
                        int b = edge[a][i];
                        int t = wt[a][i];

                        for(int m2 = 0; m2 < K; m2++)
                        {
                            Y[m2] = min(Y[m2], X[a % K] + t + minDist[b % K][m2]);
                        }
                    }
                }

                for(int m = 0; m < K; m++)
                    X[m] = Y[m];

            }
            curr_r = B%K;
        }
        else
        {
            left->query(A, B);
            right->query(A, B);
        }
    }
};

int main()
{
    cin >> K >> N >> M >> O;

    sample_mindist = vector< vector<int> >(K, vector<int>(K, INF));

    for(int e = 1; e <= M; e++)
    {
        int a, b, t;
        cin >> a >> b >> t;

        edge[a].push_back(b);
        wt[a].push_back(t);
    }

    segtree S(0/K, (N-1)/K);

    for(int o = 1; o <= O; o++)
    {
        int a, b;
        cin >> a >> b;

        S.query(a, b);
        if(X[b % K] >= INF) cout << "-1\n";
        else cout << X[b % K] << '\n';
    }
}

Compilation message (stderr)

toll.cpp: In constructor 'segtree::segtree(int, int)':
toll.cpp:53:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |                 for(int i = 0; i < edge[a].size(); i++)
      |                                ~~^~~~~~~~~~~~~~~~
toll.cpp: In member function 'void segtree::query(int, int)':
toll.cpp:93:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |                     for(int i = 0; i < edge[a].size(); i++)
      |                                    ~~^~~~~~~~~~~~~~~~
#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...