Submission #619893

#TimeUsernameProblemLanguageResultExecution timeMemory
619893CSQ31Treatment Project (JOI20_treatment)C++17
100 / 100
1398 ms320724 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define sz(a) a.size() #define fi first #define se second #define all(a) a.begin(),a.end() typedef long long int ll; typedef pair<ll,ll> pii; const int MAXN = 2e5+1; ll t[MAXN],l[MAXN],r[MAXN],c[MAXN],dist[MAXN]; int tc[MAXN]; bool ded[MAXN]; vector<pii>adj[MAXN]; vector<int>crd,add[MAXN]; set<pii>s0[4*MAXN],s1[4*MAXN]; void build(int v,int L,int R){ if(L==R){ for(int x:add[L]){ s0[v].insert({l[x] + t[x],x}); s1[v].insert({l[x] - t[x],x}); } return; } int tm = (L+R)/2; build(2*v,L,tm); build(2*v+1,tm+1,R); for(auto x:s0[2*v])s0[v].insert(x); for(auto x:s0[2*v+1])s0[v].insert(x); for(auto x:s1[2*v])s1[v].insert(x); for(auto x:s1[2*v+1])s1[v].insert(x); } vector<int>upd; void query0(int v,int l,int r,int tl,int tr,int val){ //when t[i] > t[j] if(l>r)return; if(l==tl && r==tr){ while(!s0[v].empty()){ auto it = s0[v].upper_bound(make_pair(val,2e9)); if(it==s0[v].begin())break; it--; if(ded[it->se]){ s0[v].erase(it); continue; }else{ ded[it->se] = 1; upd.pb(it->se); s0[v].erase(it); } } return; } int tm = (tl+tr)/2; query0(2*v,l,min(r,tm),tl,tm,val); query0(2*v+1,max(l,tm+1),r,tm+1,tr,val); } void query1(int v,int l,int r,int tl,int tr,int val){ //when t[i] > t[j] if(l>r)return; if(l==tl && r==tr){ while(!s1[v].empty()){ auto it = s1[v].upper_bound(make_pair(val,2e9)); if(it==s1[v].begin())break; it--; if(ded[it->se]){ s1[v].erase(it); continue; }else{ ded[it->se] = 1; upd.pb(it->se); s1[v].erase(it); } } return; } int tm = (tl+tr)/2; query1(2*v,l,min(r,tm),tl,tm,val); query1(2*v+1,max(l,tm+1),r,tm+1,tr,val); } //ri >= lj + abs(t[i]-t[j]) //if t[i] > t[j] //ri - t[i] >= lj - t[j] #define owo ios_base::sync_with_stdio(0);cin.tie(0); int main() { owo int n,m; cin>>n>>m; for(int i=0;i<m;i++){ cin>>t[i]>>l[i]>>r[i]>>c[i]; crd.pb(t[i]); l[i]--; } sort(all(crd)); crd.resize(unique(all(crd)) - crd.begin()); int ss = sz(crd); for(int i=0;i<m;i++){ tc[i] = lower_bound(all(crd),t[i]) - crd.begin(); add[tc[i]].pb(i); } build(1,0,ss-1); //for(int i=0;i<m;i++)cout<<tc[i]<<" "; //cout<<'\n'; priority_queue<pii,vector<pii>,greater<pii>>pq; for(int i=0;i<m;i++){ dist[i] = 1e18; if(l[i] == 0){ ded[i] = 1; dist[i] = c[i]; pq.push({c[i],i}); } } while(!pq.empty()){ pii v = pq.top(); //cout<<v.se<<'\n'; pq.pop(); upd.clear(); query0(1,tc[v.se],ss-1,0,ss-1,r[v.se] + t[v.se]); query1(1,0,tc[v.se],0,ss-1,r[v.se] - t[v.se]); for(int x:upd){ //cout<<v.se<<" "<<x<<'\n'; if(dist[x] > dist[v.se] + c[x]){ dist[x] = dist[v.se] + c[x]; pq.push({dist[x],x}); } } } ll ans = 1e18; for(int i=0;i<m;i++){ if(r[i] == n)ans = min(ans,dist[i]); } if(ans==1e18)ans=-1; 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...