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 MAX 9999999999999999LL
using namespace std;
typedef long long int ll;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;
struct thing{
int A,B,C,D;
};
ll ans=MAX;
int N,M;
/*
set<pl> lmap;
set<pl> rmap;
*/
ll ltree[1200000];
ll rtree[1200000];
vector<pair<int,pi> > vect;
thing things[110000];
void init(ll *tree,int l,int r,int idx){
tree[idx]=MAX;
if(l==r) return ;
int m=(l+r)>>1;
init(tree,l,m,idx*2);
init(tree,m+1,r,idx*2+1);
}
ll range(ll *tree,int l,int r,int idx,int s,int e){
if(r<s||e<l) return MAX;
if(s<=l&&r<=e) return tree[idx];
int m=(l+r)>>1;
return min(range(tree,l,m,idx*2,s,e),range(tree,m+1,r,idx*2+1,s,e));
}
ll update(ll *tree,int l,int r,int idx,int pos,ll val){
if(r<pos||pos<l) return tree[idx];
if(l==r){
return tree[idx]=min(tree[idx],val);
}
int m=(l+r)>>1;
return tree[idx]=min(update(tree,l,m,idx*2,pos,val),update(tree,m+1,r,idx*2+1,pos,val));
}
int main(){
scanf("%d %d",&M,&N);
for(int i=0;i<M;i++){
scanf("%d %d %d %d",&things[i].A,&things[i].C,&things[i].B,&things[i].D);
vect.push_back(make_pair(things[i].A,pi(i,1)));
vect.push_back(make_pair(things[i].B,pi(i,2)));
vect.push_back(make_pair(things[i].C,pi(i,3)));
}
vect.push_back(make_pair(N,pi(0,0)));
vect.push_back(make_pair(1,pi(0,0)));
int x=1;
sort(vect.begin(),vect.end());
for(int i=0;i<vect.size();){
int j;
for(j=i;j<vect.size()&&vect[i].first==vect[j].first;j++){
if(vect[j].second.second==0){
}
else if(vect[j].second.second==1){
things[vect[j].second.first].A=x;
}
else if(vect[j].second.second==2){
things[vect[j].second.first].B=x;
}
else{
things[vect[j].second.first].C=x;
}
}
x++;
i=j;
}
x--;
init(ltree,1,x,1);
init(rtree,1,x,1);
update(ltree,1,x,1,1,0);
update(rtree,1,x,1,x,0);
for(int i=0;i<M;i++){
ans=min(ans,range(ltree,1,x,1,things[i].A,x)+range(rtree,1,x,1,1,things[i].C)+things[i].D);
ll val;
val=range(ltree,1,x,1,things[i].A,x)+things[i].D;
update(ltree,1,x,1,things[i].B,val);
val=range(rtree,1,x,1,1,things[i].C)+things[i].D;
update(rtree,1,x,1,things[i].B,val);
//printf("%d %d %d %d %d\n",things[i].A,things[i].B,things[i].C,things[i].D,x);
}
/*
rmap.insert(pl(x-1,0));
lmap.insert(pl(1,0));
set<pl>::iterator lit;
set<pl>::iterator rit;
set<pl>::iterator temp;
set<pl>::iterator ttemp;
for(int i=0;i<M;i++){
int l=things[i].A;
int r=things[i].C;
int m=things[i].B;
lit=lmap.lower_bound(pl(l,-1));
rit=rmap.upper_bound(pl(r,-1));
if(lit!=lmap.end()&&rit!=rmap.begin()){
--rit;
ans=min((*lit).second+(*rit).second+things[i].D,ans);
rit++;
}
if(lit!=lmap.end()){
ll tval=(*lit).second+things[i].D;
temp=lmap.lower_bound(pl(m,0));
if(temp==lmap.end()||(*temp).second>tval){
lmap.insert(pl(m,tval));
temp=lmap.lower_bound(pl(m,0));
temp--;
while(temp!=lmap.begin()&&temp->second>=tval){
ttemp=temp--;
temp++;
lmap.erase(temp);
temp=ttemp;
}
}
}
if(rit!=rmap.begin()){
--rit;
ll tval=(*rit).second+things[i].D;
temp=rmap.upper_bound(pl(m,0));
if(temp==rmap.begin()){
}
}
}
*/
if(ans==MAX) printf("-1\n");
else printf("%lld\n",ans);
return 0;
}
Compilation message (stderr)
pinball.cpp: In function 'int main()':
pinball.cpp:55:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<vect.size();){
~^~~~~~~~~~~~
pinball.cpp:57:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(j=i;j<vect.size()&&vect[i].first==vect[j].first;j++){
~^~~~~~~~~~~~
pinball.cpp:44:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&M,&N);
~~~~~^~~~~~~~~~~~~~~
pinball.cpp:46:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d %d %d",&things[i].A,&things[i].C,&things[i].B,&things[i].D);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |