제출 #1155367

#제출 시각아이디문제언어결과실행 시간메모리
1155367the_coding_poohSky Walking (IOI19_walk)C++20
24 / 100
2314 ms316304 KiB
#include "walk.h"
#include <bits/stdc++.h>
using namespace std;

#define fs first
#define sc second
#define all(x) x.begin(), x.end()

const int SIZE = 2e6 + 5;

struct d_to_v{
    long long d;
    int v;
    d_to_v (int _v, long long _d) : v(_v), d(_d) {};
    d_to_v operator+(d_to_v d2){
        return d_to_v(d2.v, d + d2.d);
    }
};

vector <d_to_v> graph[SIZE];

bool cmp(d_to_v a, d_to_v b){
    return a.d > b.d;
}

void Dijkstra(int S, vector <long long> &dist){
    bitset <SIZE> been;
    priority_queue<d_to_v, vector<d_to_v>, decltype(&cmp)> pq(cmp);
    pq.push(d_to_v(S, 0));
    while (!pq.empty()){
        d_to_v tp = pq.top();
        pq.pop();
        if(been[tp.v])
            continue;
        been[tp.v] = 1;
        dist[tp.v] = tp.d;
        for(auto i:graph[tp.v]){
			if(been[i.v])
				continue;
            pq.push(tp + i);
        }
    }
    return;
}

int ptr = 0;

vector <pair<int, long long>> pt[SIZE];

map <pair<int, long long>, int> hpt;

int idx(int a, long long b){
	if(!hpt.count({a, b}))
		hpt[{a, b}] = ++ptr;
	return hpt[{a, b}];
}

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();
	vector <pair<long long, pair<int, int>>> event;
	for (int i = 0; i < m; i++){
		event.push_back({y[i], {l[i], r[i]}});
	}
	set <int> sid;
	for (int i = 0; i < n; i++){
		event.push_back({h[i] + 1, {-1, i}});
		sid.insert(i);
	}
	sort(all(event));
	for (auto e:event){
		if(e.sc.fs == -1){
			sid.erase(e.sc.sc);
			continue;
		}
		vector <int> id;
		for (auto t = sid.lower_bound(e.sc.fs); 1 ; t = next(t)){
			id.push_back(*t);
			if(*t == e.sc.sc)
				break;
		}
		for (int j = 0; j < (int)id.size() - 1; j++){
			graph[idx(id[j], e.fs)].push_back(d_to_v(idx(id[j + 1], e.fs), x[id[j + 1]] - x[id[j]]));
			graph[idx(id[j + 1], e.fs)].push_back(d_to_v(idx(id[j], e.fs), x[id[j + 1]] - x[id[j]]));
		}
	}
	idx(s, 0);
	idx(g, 0);
	for (auto i : hpt){
		pt[i.fs.fs].push_back({i.sc, i.fs.sc});
	}
	for (int i = 0; i < n; i++){
		for (int j = 0; j < (int)pt[i].size() - 1; j++){
			graph[pt[i][j].fs].push_back(d_to_v(pt[i][j + 1].fs, pt[i][j + 1].sc - pt[i][j].sc));
			graph[pt[i][j + 1].fs].push_back(d_to_v(pt[i][j].fs, pt[i][j + 1].sc - pt[i][j].sc));
		}
	}
	vector <long long> vec(ptr + 1, -1);
	Dijkstra(idx(s, 0), vec);
	return vec[idx(g, 0)];
}
#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...