This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define sz() size()
#define fr first
#define sc second
#define int long long
#define mp make_pair
#define rc(s) return cout<<s,0
#define rcc(s) cout<<s,exit(0)
using namespace std;
const int mmax=100005;
int m,n,ans=1e18;
struct bar{
int l,r,mid,cost;
}arr[mmax];
vector<int>compress;
vector<pair<int,int>>aint(4*mmax);
void update(int l,int r,int pos,int val,int id,int nod){
if(l==r){
if(id==1) aint[nod].fr=min(aint[nod].fr,val);
if(id==2) aint[nod].sc=min(aint[nod].sc,val);
}
else{
int mid=l+(r-l)/2;
if(pos<=mid)update(l,mid,pos,val,id,2*nod);
else update(mid+1,r,pos,val,id,2*nod+1);
if(id==1) aint[nod].fr=min(aint[2*nod].fr,aint[2*nod+1].fr);
if(id==2) aint[nod].sc=min(aint[2*nod].sc,aint[2*nod+1].sc);
}
}
int query(int l,int r,int le,int ri,int id,int nod){
if(l>ri || r<le) return 1e18;
else if(l>=le && r<=ri){
if(id==1) return aint[nod].fr;
if(id==2) return aint[nod].sc;
}
else{
int mid=l+(r-l)/2;
return min(query(l,mid,le,ri,id,2*nod),query(mid+1,r,le,ri,id,2*nod+1));
}
}
int32_t main(){
ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
srand(chrono::steady_clock::now().time_since_epoch().count());
cin >> m >> n;
for(int i=1;i<=m;i++){
cin >> arr[i].l >> arr[i].r >> arr[i].mid >> arr[i].cost;
compress.push_back(arr[i].mid);
}
compress.push_back(1);
compress.push_back(n);
sort(all(compress));
compress.resize(unique(all(compress))-compress.begin());
for(int i=1;i<=m;i++) arr[i].mid=lower_bound(all(compress),arr[i].mid)-compress.begin()+1;
aint.resize(4*compress.size()+5);
int nnew=(int)compress.size();
for(int i=1;i<=4*nnew;i++) aint[i].fr=aint[i].sc=1e18;
update(1,nnew,1,0,1,1);
update(1,nnew,nnew,0,2,1);
for(int i=1;i<=m;i++){
int val1=0,val2=0;
int le=lower_bound(all(compress),arr[i].l)-compress.begin()+1;
int ri=upper_bound(all(compress),arr[i].r)-compress.begin();
if(le<=ri){
val1=query(1,nnew,le,ri,1,1);
if(val1!=1e18){
val1+=arr[i].cost;
update(1,nnew,arr[i].mid,val1,1,1);
}
}
if(le<=ri){
val2=query(1,nnew,le,ri,2,1);
if(val2!=1e18){
val2+=arr[i].cost;
update(1,nnew,arr[i].mid,val2,2,1);
}
}
if(val1!=1e18 && val2!=1e18){
ans=min(ans,val1+val2-arr[i].cost);
}
}
if(ans==1e18) rc(-1);
else rc(ans);
}
Compilation message (stderr)
pinball.cpp: In function 'long long int query(long long int, long long int, long long int, long long int, long long int, long long int)':
pinball.cpp:51:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |