Submission #296179

#TimeUsernameProblemLanguageResultExecution timeMemory
296179Noam13Sky Walking (IOI19_walk)C++14
15 / 100
1260 ms549112 KiB
#include "walk.h"
#include <bits/stdc++.h>
#define int int64_t
#define vi vector<int>
#define vvi vector<vi>
#define pb push_back
#define ii pair<int, int>
#define vii vector<ii>
#define x first
#define y second
#define all(a) a.begin(), a.end()
#define loop(i,s,e) for(int i=s;i<e;++i)
#define chkmin(a,b) a = min(a,b)
using namespace std;
const int INF = 2e18;
struct SEG{
	int l,r,mid;
	multiset<int> vs;
	int vp = INF, vm = INF;
	SEG *lp=0, *rp=0;
	SEG(int l, int r): l(l), r(r), mid((l+r)/2){
		if (l+1==r) vs.insert(INF);
	}
	void fix(){
		if (!lp) lp = new SEG(l, mid);
		if (!rp) rp = new SEG(mid, r);
		vp = min(lp->vp, rp->vp);
		vm = min(lp->vm, rp->vm);
	}
	void update(int i, int v, bool in){
		if (l+1==r){
			if (in){
				vs.insert(v);
			}
			else{
				vs.erase(vs.find(v));
			}
			int vv = *vs.begin();
			vp = vv + l;
			vm = vv - l;
			return ;
		}
		fix();
		if (i<mid) lp->update(i, v, in);
		else rp->update(i, v, in);
		fix();
	}
	int query(int a, int b, bool plus){
		if (a>=r || b<=l) return INF;
		if (a<=l && r<=b) return (plus?vp:vm);
		fix();
		return min(lp->query(a,b,plus), rp->query(a,b,plus));
	}
};
long long min_distance(vector<int32_t> x, vector<int32_t> h, vector<int32_t> l, vector<int32_t> r, vector<int32_t> y, int32_t s, int32_t g) {
	int n = x.size(), m = l.size();
	vvi in(n), out(n);
	loop(i,0,m){
		in[l[i]].pb(i);
		out[r[i]].pb(i);
	}
	SEG seg(0, 2e9);
	seg.update(0,-x[0],1);
	vi vals(m);
	int ans;
	loop(pos,0,n){
		for(auto i:in[pos]){
			int v  = INF;
			chkmin(v, y[i] + seg.query(0, y[i], 0));
			chkmin(v, seg.query(y[i], h[pos]+1, 1) - y[i]);
			//v+=x[pos];
			vals[i] = v;
			//vals.pb({y[i], v});
			seg.update(y[i], vals[i], 1);
		}
		ans = seg.query(0, h[pos]+1, 1) + x[pos];
		for(auto i:out[pos]){
			seg.update(y[i], vals[i], 0);
		}
		if (pos==0){
			seg.update(0, -x[0],0);
		}
	}
	if (ans>INF/2) ans = -1;
	return ans;
}
/*
clear
g++ grader.cpp walk.cpp -o a ; ./a
7 5
0 8
3 7
5 9
7 7
10 6
12 6
14 9
0 1 1
0 2 6
2 3 1
3 4 2
4 6 5
0 6

2 1
0 2
1 2
0 1 2
0 1
*/

Compilation message (stderr)

walk.cpp: In function 'long long int min_distance(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, int32_t, int32_t)':
walk.cpp:84:2: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
   84 |  if (ans>INF/2) ans = -1;
      |  ^~
#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...