Submission #714963

#TimeUsernameProblemLanguageResultExecution timeMemory
714963dsyzPinball (JOI14_pinball)C++17
51 / 100
916 ms524288 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define MAXN (1000005)
struct node{
	ll s,e,m,val,lazy;
	node *l = nullptr,*r = nullptr;
	node(ll S,ll E){
		s = S;
		e = E;
		m = (s + e) / 2;
		val = 1e18;
		lazy = 1e18;
	}
	void create(){
		if(l == nullptr && s != e){
			l = new node(s,m);
			r = new node(m + 1,e);
		}
	}
	void propagate(){
		create();
		if(lazy == 1e18) return;
		val = min(val,lazy);
		if(s != e){
			l->lazy = min(l -> lazy,lazy);
			r->lazy = min(r -> lazy,lazy);
		}
	}
	void update(ll S,ll E,ll v){
		if(s == S && e == E) lazy = min(lazy,v);
		else{
			create();
			if(E <= m) l->update(S,E,v);
			else if(S > m) r->update(S,E,v);
			else l->update(S,m,v),r->update(m + 1,E,v);
			l->propagate(),r->propagate();
			val = min(l->val,r->val);
		}
	}
	long long query(ll S,ll E){
		create();
		propagate();
		if(s == S && e == E) return val;
		else if(S > m) return r->query(S,E);
		else if(E <= m) return l->query(S,E);
		else return min(l->query(S,m),r-> query(m + 1,E));
	}
} *root;
int main() {
	ios_base::sync_with_stdio(false);cin.tie(0);
	ll M,N;
	cin>>M>>N;
	root = new node(0,N + 5);
	pair<ll,ll> range[M];
	ll C[M], D[M];
	vector<ll> d;
	for(ll i = 0;i < M;i++){
		cin>>range[i].first>>range[i].second>>C[i]>>D[i];
	}
	ll dp1[M]; //start from column 1
	for(ll i = 0;i < M;i++){
		if(range[i].first == 1) dp1[i] = D[i];
		else dp1[i] = 1e18;
	}
	for(ll i = 0;i < M;i++){
		ll prev = root -> query(range[i].first,range[i].second);
		if(range[i].first == 1){
			dp1[i] = D[i];
		}else{
			if(prev < 1e18) dp1[i] = prev + D[i];
		}
		if(dp1[i] < 1e18) root -> update(C[i],C[i],dp1[i]);
	}
	root = new node(0,N + 5);
	ll dpN[M]; //start from column N
	for(ll i = 0;i < M;i++){
		if(range[i].second == N) dpN[i] = D[i];
		else dpN[i] = 1e18;
	}
	for(ll i = 0;i < M;i++){
		ll prev = root -> query(range[i].first,range[i].second);
		if(range[i].second == N){
			dpN[i] = D[i];
		}else{
			if(prev < 1e18) dpN[i] = prev + D[i];
		}
		if(dpN[i] < 1e18) root -> update(C[i],C[i],dpN[i]);
	}
	ll ans = 2e18 + 5;
	for(ll i = 0;i < M;i++){
		if(dp1[i] < 1e18 && dpN[i] < 1e18){
			ans = min(ans,dp1[i] + dpN[i] - D[i]);
		}
	}
	if(ans >= 1e18) cout<<-1<<'\n';
	else cout<<ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...