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>
using namespace std;
typedef long long int lld;
#define INF 1000000000000000
lld device[100000][4];
vector<int> clr;
class ST{
lld arr[10000000];
public:
void init(int a, int b, int node){
//cout<<a<<" "<<b<<endl;
arr[node]=INF;
if(a==b)return;
int mid=(a+b)/2;
init(a,mid,2*node);
init(mid+1,b,2*node+1);
}
void update(int pos, lld val,int a, int b, int node){
//cout<<a<<" "<<b<<" "<<node<<endl;
if(pos<a || b<pos)return;
arr[node]=min(arr[node],val);
if(a==b)return;
int mid=(a+b)/2;
update(pos,val,a,mid,2*node);
update(pos,val,mid+1,b,2*node+1);
}
lld query(int a, int b, int node, int x, int y){
if(y<a || b<x)return INF;
if(x<=a && b<=y)return arr[node];
int mid=(a+b)/2;
return min(query(a,mid,2*node,x,y),query(mid+1,b,2*node+1,x,y));
}
void print(int a, int b, int node){
if(a==b){
cout<<a<<" "<<arr[node]<<endl;
return;
}
int mid=(a+b)/2;
print(a,mid,2*node);
print(mid+1,b,2*node+1);
}
};
int main(){
int m,n;
cin>>m>>n;
vector<int> table;
table.push_back(0);
table.push_back(n-1);
for(int i=0;i<m;i++){
cin>>device[i][0]>>device[i][1]>>device[i][2]>>device[i][3];
for(int j=0;j<3;j++)device[i][j]--,table.push_back(device[i][j]);
}
sort(table.begin(),table.end());
for(int i=0;i<table.size();i++){
if(i==table.size()-1 || table[i]!=table[i+1]){
clr.push_back(table[i]);
}
}//cout<<clr.size()<<endl;
for(int i=0;i<m;i++){
for(int j=0;j<3;j++){
int lo,hi;
lo=0;
hi=clr.size()-1;
while(hi-lo>0){
int mid=(hi+lo)/2;
if(clr[mid]==device[i][j]){
hi=lo=mid;
}
if(clr[mid]>device[i][j]){
hi=mid-1;
}
if(clr[mid]<device[i][j]){
lo=mid+1;
}
}
device[i][j]=lo;
//cout<<lo<<" ";
}//cout<<endl;
}
n=clr.size();
ST *L,*R;
L=new ST();
R=new ST();
L->init(0,n-1,1);
R->init(0,n-1,1);
L->update(0,0,0,n-1,1);
R->update(n-1,0,0,n-1,1);
lld ans=INF;
for(int i=0;i<m;i++){
//cout<<device[i][0]<<" "<<device[i][1]<<" "<<device[i][2]<<endl;
/*for(int j=device[i][0];j<=device[i][1];j++){
DPL[device[i][2]]=min(DPL[device[i][2]],DPL[j]+device[i][3]);
DPR[device[i][2]]=min(DPR[device[i][2]],DPR[j]+device[i][3]);
}*/
//print(0,n-1,1);
lld VL=L->query(0,n-1,1,device[i][0],device[i][1]);
lld VR=R->query(0,n-1,1,device[i][0],device[i][1]);
ans=min(ans,VL+VR+device[i][3]);
L->update(device[i][2],VL+device[i][3],0,n-1,1);
R->update(device[i][2],VR+device[i][3],0,n-1,1);
/*cout<<i<<endl;
for(int j=0;j<n;j++){
cout<<DPL[j]<<" "<<DPR[j]<<endl;
}*/
/*for(int j=device[i][0];j<=device[i][1];j++){
for(int k=device[i][0];k<=device[i][1];k++){
ans=min(ans,DPL[j]+DPR[k]+device[i][3]);
//cout<<i<<" "<<j<<" "<<k<<endl;
}
}*/
}
if(ans!=INF)cout<<ans<<endl;
else cout<<-1<<endl;
return 0;
}
Compilation message (stderr)
pinball.cpp: In function 'int main()':
pinball.cpp:56:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<table.size();i++){
~^~~~~~~~~~~~~
pinball.cpp:57:7: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(i==table.size()-1 || table[i]!=table[i+1]){
~^~~~~~~~~~~~~~~~
# | 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... |