Submission #1317533

#TimeUsernameProblemLanguageResultExecution timeMemory
1317533boclobanchatPinball (JOI14_pinball)C++20
11 / 100
1 ms332 KiB
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,mid,r,cost;
};
const int MAXN=5e5+5;
const long long INF=1e18;
long long dpl[MAXN],dpr[MAXN],seg[MAXN*4];
int val[MAXN];
node A[MAXN];
void update(int l,int r,int i,long long val,int pos)
{
	if(i<l||r<i) return ;
	if(l==r)
	{
		seg[pos]=min(seg[pos],val);
		return ;
	}
	int mid=(l+r)/2;
	update(l,mid,i,val,pos*2);
	update(mid+1,r,i,val,pos*2+1);
	seg[pos]=min(seg[pos*2],seg[pos*2+1]);
}
long long get(int l,int r,int u,int v,int pos)
{
	if(u<=l&&r<=v) return seg[pos];
	int mid=(l+r)/2;
	if(v<=mid) return get(l,mid,u,v,pos*2);
	if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
	return min(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1));
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int m,n;
	cin>>n>>m;
	int cnt=0;
	val[++cnt]=1,val[++cnt]=m,val[++cnt]=m+1;
	A[1]={1,1,1,0};
	A[2]={m,m,m,0};
	for(int i=3;i<=n+2;i++)
	{
		int l,mid,r,cost;
		cin>>l>>r>>mid>>cost;
		val[++cnt]=l,val[++cnt]=mid,val[++cnt]=mid+1,val[++cnt]=r+1;
		A[i]={l,mid,r,cost};
	}
	sort(val+1,val+cnt+1);
	int cc=0;
	for(int i=1;i<=cnt;i++) if(val[i]!=val[cc]) val[++cc]=val[i];
	for(int i=1;i<=n+2;i++)
	{
		A[i].l=lower_bound(val+1,val+cc+1,A[i].l)-val;
		A[i].mid=lower_bound(val+1,val+cc+1,A[i].mid)-val;
		A[i].r=lower_bound(val+1,val+cc+1,A[i].r+1)-val-1;
	}
	for(int i=1;i<=cc*4;i++) seg[i]=INF;
	for(int i=1;i<=n+2;i++) if(i==1) update(1,cc,A[i].mid,dpl[i]=0,1);
	else update(1,cc,A[i].mid,dpl[i]=get(1,cc,A[i].l,A[i].mid,1)+A[i].cost,1);
	for(int i=1;i<=cc*4;i++) seg[i]=INF;
	for(int i=1;i<=n+2;i++) if(i==2) update(1,cc,A[i].mid,dpr[i]=0,1);
	else update(1,cc,A[i].mid,dpr[i]=get(1,cc,A[i].mid,A[i].r,1)+A[i].cost,1);
	long long ans=INF;
	for(int i=1;i<=n+2;i++) ans=min(ans,dpl[i]+dpr[i]-A[i].cost);
	if(ans==INF) cout<<-1;
	else cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...