Submission #416767

# Submission time Handle Problem Language Result Execution time Memory
416767 2021-06-02T22:04:42 Z peuch Sky Walking (IOI19_walk) C++17
0 / 100
150 ms 34964 KB
#include "walk.h"
#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 10;
const long long INF = 1e18;

map<pair<int, int>, int> node;
vector<long long> dist;
vector<bool> marc;
vector<vector<int> > ar, wg;
int cnt = -1;

struct event{
	int l, r, h;
	event(int _l = 0, int _r = 0, int _h = 0){
		l = _l, r = _r, h = _h;
	}
	bool operator < (event x) const {
		if(h == x.h) return r - l < x.r - x.l;
		return h > x.h;	
	}
};

vector<event> line;
vector<int> last;

void dijkstra(int ini);

int create(int x, int y){
	assert(x < last.size());
	if(node[make_pair(x, y)] != 0) return node[make_pair(x, y)];
	node[make_pair(x, y)] = ++cnt;
	ar.push_back(vector<int>(0));
	wg.push_back(vector<int>(0));
	dist.push_back(INF);
	marc.push_back(0);
	if(last[x] != 0) {
		ar[node[make_pair(x, y)]].push_back(node[make_pair(x, last[x])]);
		ar[node[make_pair(x, last[x])]].push_back(node[make_pair(x, y)]);
		wg[node[make_pair(x, y)]].push_back(abs(y - last[x]));
		wg[node[make_pair(x, last[x])]].push_back(abs(y - last[x]));
	}
	last[x] = y;
	return cnt;
}

long long min_distance(std::vector<int> X, std::vector<int> H, std::vector<int> L, std::vector<int> R, std::vector<int> Y, int S, int G) {
	
	for(int i = 0; i < X.size(); i++)
		line.push_back(event(i, i, H[i]));
	
	for(int i = 0; i < L.size(); i++)
		line.push_back(event(L[i], R[i], Y[i]));
	
	sort(line.begin(), line.end());
	last = vector<int> (X.size(), 0);
	
	set<int> torres;
	for(int i = 0; i < line.size(); i++){
		int l = line[i].l, r = line[i].r, y = line[i].h;
		if(l == r) continue;
		int lV = create(l, y);
		int rV = create(r, y);
		ar[lV].push_back(rV);
		ar[rV].push_back(lV);
		ar[lV].push_back(abs(X[r] - X[l]));
		ar[rV].push_back(abs(X[r] - X[l]));
	}
	for(int i = 0; i < X.size(); i++)
		create(i, 0);
	dijkstra(create(S, 0));
	if(dist[create(G, 0)] >= INF) dist[create(G, 0)] = -1;
	return dist[create(G, 0)];
}

void dijkstra(int ini){
	dist[ini] = 0;
	set<pair<long long, int> > s;
	for(int i = 0; i <= cnt; i++)
		s.insert(make_pair(dist[i], i));
	while(!s.empty()){
		int cur = s.begin()->second;
		if(dist[cur] >= INF) break;
		marc[cur] = 1;
		s.erase(s.begin());
		for(int i = 0; i < ar[cur].size(); i++){
			int viz = ar[cur][i];
			if(marc[viz]) continue;
			s.erase(make_pair(dist[viz], viz));
			dist[viz] = min(dist[viz], dist[cur] + wg[cur][i]);
			s.insert(make_pair(dist[viz], viz));
		}
	}
}

Compilation message

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from walk.cpp:2:
walk.cpp: In function 'int create(int, int)':
walk.cpp:31:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |  assert(x < last.size());
      |         ~~^~~~~~~~~~~~~
walk.cpp: In function 'long long int min_distance(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, int, int)':
walk.cpp:50:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |  for(int i = 0; i < X.size(); i++)
      |                 ~~^~~~~~~~~~
walk.cpp:53:19: 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 < L.size(); i++)
      |                 ~~^~~~~~~~~~
walk.cpp:60:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |  for(int i = 0; i < line.size(); i++){
      |                 ~~^~~~~~~~~~~~~
walk.cpp:70:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |  for(int i = 0; i < X.size(); i++)
      |                 ~~^~~~~~~~~~
walk.cpp: In function 'void dijkstra(int)':
walk.cpp:87:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |   for(int i = 0; i < ar[cur].size(); i++){
      |                  ~~^~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 150 ms 34964 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 150 ms 34964 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -