Submission #129360

#TimeUsernameProblemLanguageResultExecution timeMemory
129360davitmargToll (BOI17_toll)C++17
100 / 100
297 ms66908 KiB
/*DavitMarg*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <iomanip>
#include <stack>
#include <cassert>
#include <iterator>
#include <bitset>
#include <fstream>
#define mod 1000000007ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
#define all(v) v.begin(),v.end()
using namespace std;
 
struct node
{
    LL d[6][6];
    node()
    {
        for(int i=0;i<5;i++)
			for(int j=0;j<5;j++)
                d[i][j]=mod*100005ll;
    }
};
 
LL k,n,m,o;
bool used[50004];
vector<int> a[50004];
vector<pair<int,LL>> g[50004];
node t[4*50004];
 
node merge(node a,node b,int pos)
{
	node r;
    for(int s=0;s<k;s++)
		for(int e=0;e<k;e++)
            for(int v=pos*k;v<pos*k+k;v++)
                for(int i=0;i<g[v].size();i++)
				{
					int to=g[v][i].first;
					LL d=g[v][i].second;
                    r.d[s][e]=min( a.d[s][v-pos*k]+b.d[to-pos*k-k][e]+d ,r.d[s][e]);
				}
	return r;
}
 
void build(int v,int l,int r)
{
    if(l==r)
	{
        for(int i=0;i<k;i++)
            t[v].d[i][i]=0;
        return;
	}
	int m=(l+r)/2;
    build(v*2,l,m);
    build(v*2+1,m+1,r);
    t[v]=merge(t[v*2],t[v*2+1],m);
}
 
node get(int v,int l,int r,int i,int j)
{
    if(i>j)
        return node();
    if(l==i && r==j)
		return t[v];
	int m=(l+r)/2;
	if(j<=m)
        return get(v*2,l,m,i,j);
	else if(i>=m+1)
        return get(v*2+1,m+1,r,i,j);
	else
		return merge(
			get(v*2,l,m,i,m),
			get(v*2+1,m+1,r,m+1,j),
			m
		);
}
 
int main()
{
	cin>>k>>n>>m>>o;
    while(m--)
	{
		int a,b;
		LL d;
		scanf("%d%d%lld",&a,&b,&d);
		g[a].PB(MP(b,d));
	}
 
    for(int i=0;i<n;i++)
        a[i/k].PB(i);
 
    n--;
    build(1,0,n/k);
	while(o--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		LL ans=get(1,0,n/k,a/k,b/k).d[a-(a/k)*k][b-(b/k)*k];
		if(ans>=mod*100005ll)
			ans=-1;
        printf("%lld\n",ans);
	}
 
	return 0;
}
 
 
/*
 
5 14 5 5
0 5 9
5 12 10
0 7 7
7 12 8
4 7 10
0 12
0 5
0 7
7 12
0 13
 
*/

Compilation message (stderr)

toll.cpp: In function 'node merge(node, node, int)':
toll.cpp:48:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(int i=0;i<g[v].size();i++)
                             ~^~~~~~~~~~~~
toll.cpp: In function 'int main()':
toll.cpp:97:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%lld",&a,&b,&d);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~
toll.cpp:109:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&a,&b);
   ~~~~~^~~~~~~~~~~~~~
#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...