Submission #1094609

#TimeUsernameProblemLanguageResultExecution timeMemory
1094609emptypringlescanTreatment Project (JOI20_treatment)C++17
100 / 100
449 ms151748 KiB
#include <bits/stdc++.h> using namespace std; pair<pair<int,int>,pair<int,int> > arr[100005]; pair<int,int> ran[100005]; struct node{ int s,e,m; node *l, *r; int val; node(int S, int E){ s=S; e=E; if(s+e>=0) m=(s+e)/2; else m=(s+e-1)/2; val=100004; l=r=NULL; } void prop(){ if(l==NULL){ l=new node(s,m); r=new node(m+1,e); } } void update(int S, int V){ if(s==e){ val=V; return; } prop(); if(S<=m) l->update(S,V); else r->update(S,V); val=(ran[l->val].second<=ran[r->val].second?l->val:r->val); } int query(int S, int E){ if(S<=s&&e<=E) return val; if(l==NULL) return 100004; if(E<=m) return l->query(S,E); else if(S>m) return r->query(S,E); else{ int a=l->query(S,m),b=r->query(m+1,E); return (ran[a].second<=ran[b].second?a:b); } } } *root; bool cmp(int a, int b){ return ran[a].second>ran[b].second; } unordered_map<int,vector<int> > um; priority_queue<pair<long long,int>,vector<pair<long long,int> >,greater<pair<long long,int> > > pq; int32_t main(){ ios::sync_with_stdio(false); cin.tie(nullptr); ran[100004]={2e9+5,2e9+5}; int n,m; root=new node(-2e9-5,2e9+5); cin >> n >> m; for(int i=0; i<m; i++){ int t,l,r,c; cin >> t >> l >> r >> c; arr[i]={{t,l},{r,c}}; ran[i]={t-l,t+l}; if(l==1){ pq.push({c,i}); } else um[t-l].push_back(i); } for(auto [i,j]:um){ sort(um[i].begin(),um[i].end(),cmp); root->update(i,um[i].back()); um[i].pop_back(); } while(!pq.empty()){ long long a=pq.top().first; int b=pq.top().second; pq.pop(); if(arr[b].second.first==n){ cout << a; return 0; } pair<int,int> qu={arr[b].first.first-arr[b].second.first-1,arr[b].first.first+arr[b].second.first+1}; while(true){ int x=root->query(qu.first,qu.second); if(x==100004||ran[x].second>qu.second) break; pq.push({a+arr[x].second.second,x}); if(!um[ran[x].first].empty()){ root->update(ran[x].first,um[ran[x].first].back()); um[ran[x].first].pop_back(); } else root->update(ran[x].first,100004); } } cout << -1; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...