Submission #284186

#TimeUsernameProblemLanguageResultExecution timeMemory
284186ChrisTPinball (JOI14_pinball)C++17
100 / 100
210 ms12556 KiB
#include <bits/stdc++.h>
using namespace std;
vector<int> xs;
int getx (int x) {return lower_bound(xs.begin(),xs.end(),x) - xs.begin() + 1;}
const int MN = 3e5 + 5; const long long INF = 1e18;
long long tree[MN<<1]; int sz;
void update (int i, long long v) {
	if (v >= tree[i += sz - 1]) return;
	for (tree[i] = v; i > 1; i >>= 1) 
		tree[i>>1] = min(tree[i],tree[i^1]);
}
long long query (int l, int r) {
	long long res = INF;
	for (l+=sz-1,r+=sz;l<r;l>>=1,r>>=1) {
		if (l&1) res = min(res,tree[l++]);
		if (r&1) res = min(res,tree[--r]);
	} 
	return res;
}
int main () {
	int m,n;
	scanf ("%d %d",&m,&n);
	vector<array<int,4>> v(m);
	for (auto &au : v) {
		scanf ("%d %d %d %d",&au[0],&au[1],&au[2],&au[3]);
		xs.push_back(au[0]); xs.push_back(au[1]); xs.push_back(au[2]);
	}
	xs.push_back(1); xs.push_back(n);
	sort(xs.begin(),xs.end()); xs.erase(unique(xs.begin(),xs.end()),xs.end());
	sz = xs.size();
	long long ans = INF; vector<long long> mn(m);
	for (int i = 1; i < (sz << 1); i++) tree[i] = INF;
	update(getx(1),0);
	for (int i = 0; i < m; i++) {
		v[i][0] = getx(v[i][0]); v[i][1] = getx(v[i][1]); v[i][2] = getx(v[i][2]);
		mn[i] = query(v[i][0],v[i][1]);
		update(v[i][2],mn[i] + v[i][3]);
	}
	for (int i = 1; i < (sz << 1); i++) tree[i] = INF;
	update(getx(n),0);
	for (int i = 0; i < m; i++) {
		long long go = query(v[i][0],v[i][1]) + v[i][3];
		ans = min(ans,go + mn[i]);
		update(v[i][2],go);
	}
	if (ans >= INF/2) ans = -1;
	printf ("%lld\n",ans);
	return 0;
}

Compilation message (stderr)

pinball.cpp: In function 'int main()':
pinball.cpp:22:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   22 |  scanf ("%d %d",&m,&n);
      |  ~~~~~~^~~~~~~~~~~~~~~
pinball.cpp:25:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   25 |   scanf ("%d %d %d %d",&au[0],&au[1],&au[2],&au[3]);
      |   ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...