Submission #1344044

#TimeUsernameProblemLanguageResultExecution timeMemory
1344044MuhammadSaramSky Walking (IOI19_walk)C++20
24 / 100
4083 ms380576 KiB
#include "walk.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int M = 1e6 + 9;
const ll inf = 1e18;

vector<pair<int,int>> nei[M]; 
ll dis[M];

ll dj()
{
	for (int i=0;i<M;i++) dis[i]=inf;
	dis[0]=0;
	set<pair<ll,int>> se;
	se.insert({0,0});
	while (se.size())
	{
		auto p=*se.begin();se.erase(se.begin());
		for (auto [i,d]:nei[p.second])
			if (dis[i]>p.first+d)
			{
				se.erase({dis[i],i});
				dis[i]=p.first+d;
				se.insert({dis[i],i});
			}
	}
	if (dis[1]==inf) dis[1]=-1;
	return dis[1];
}

long long min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int s, int g)
{
	int n=x.size(), m=l.size();
	map<pair<int,int>,int> ind;
	ind[{s,0}]=0, ind[{g,0}]=1;
	vector<pair<int,int>> v;
	vector<int> ins[n], ins1[m];
	ins[s]=ins[g]={0};
	for (int i=0;i<n;i++)
		v.push_back({h[i],i+m});
	for (int i=0;i<m;i++)
		v.push_back({y[i],i});
	sort(v.rbegin(),v.rend());
	set<int> se;
	for (auto [a,b]:v)
	{
		if (b<m)
		{
			auto it=se.lower_bound(l[b]);
			while (1)
			{
				int i=*it;
				if (ind.find({i,a})==ind.end())
					ind[{i,a}]=ind.size();
				ins[i].push_back(a), ins1[b].push_back(i);
				if (i==r[b]) break;
				it++;
			}
		}
		else
			se.insert(b-m);
	}
	for (int i=0;i<n;i++)
	{
		sort(ins[i].begin(),ins[i].end());
		for (int j=0;j+1<ins[i].size();j++)
			nei[ind[{i,ins[i][j]}]].push_back({ind[{i,ins[i][j+1]}],ins[i][j+1]-ins[i][j]}),
			nei[ind[{i,ins[i][j+1]}]].push_back({ind[{i,ins[i][j]}],ins[i][j+1]-ins[i][j]});
	}
	for (int i=0;i<m;i++)
	{
		for (int j=0;j+1<ins1[i].size();j++)
			nei[ind[{ins1[i][j],y[i]}]].push_back({ind[{ins1[i][j+1],y[i]}],x[ins1[i][j+1]]-x[ins1[i][j]]}),
			nei[ind[{ins1[i][j+1],y[i]}]].push_back({ind[{ins1[i][j],y[i]}],x[ins1[i][j+1]]-x[ins1[i][j]]});
	}
	return dj();
}
#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...