Submission #445885

#TimeUsernameProblemLanguageResultExecution timeMemory
445885kig9981Treatment Project (JOI20_treatment)C++17
0 / 100
286 ms524288 KiB
#include <bits/stdc++.h> #ifdef NON_SUBMIT #define TEST(n) (n) #define tout cerr #else #define TEST(n) ((void)0) #define tout cin #endif using namespace std; struct Seg { int l, r, v; Seg() : l(0), r(0), v(0x3f3f3f3f) {} } tree[44444444]; const long long LINF=0x3f3f3f3f3f3f3f3fLL; const int SZ=1<<18, INF=0x3f3f3f3f; vector<int> P; vector<pair<int,int>> x, y; vector<tuple<int,int,int,int,int>> A; long long dist[100000]; int node_cnt=2*SZ, chk[100000], lx[200000], rx[200000], ly[200000], ry[200000]; void set_tree2(int n, int v, int p, int s=0, int e=SZ-1) { int m=(s+e)>>1; if(s==e) { tree[p].v=v; return; } if(n<=m) { if(tree[p].l==0) tree[p].l=node_cnt++; set_tree2(n,v,tree[p].l,s,m); } else { if(tree[p].r==0) tree[p].r=node_cnt++; set_tree2(n,v,tree[p].r,m+1,e); } tree[p].v=min(tree[tree[p].l].v,tree[tree[p].r].v); } void set_tree(int x, int y, int v) { for(set_tree2(y,v,x+=SZ);x>>=1;) set_tree2(y,v,x); } int get_min2(int n1, int n2, int p, int s=0, int e=SZ-1) { int m=(s+e)>>1; if(n2<n1 || n2<s || e<n1 || p==0) return INF; if(n1<=s && e<=n2) return tree[p].v; return min(get_min2(n1,n2,tree[p].l,s,m),get_min2(n1,n2,tree[p].r,m+1,e)); } int get_min(int x1, int y1, int x2, int y2) { int ret=INF; for(x1+=SZ,x2+=SZ;x1<=x2;x1>>=1,x2>>=1) { if(x1&1) ret=min(ret,get_min2(y1,y2,x1++)); if(~x2&1) ret=min(ret,get_min2(y1,y2,x2--)); } return ret; } void get_pos2(int n1, int n2, long long v, int p, int s=0, int e=SZ-1) { int m=(s+e)>>1; if(n2<n1 || n2<s || e<n1 || tree[p].v!=v) return; if(s==e) { P.push_back(y[m].second); return; } get_pos2(n1,n2,v,tree[p].l,s,m); get_pos2(n1,n2,v,tree[p].r,m+1,e); } void get_pos(int x1, int y1, int x2, int y2, int v) { P.clear(); for(x1+=SZ,x2+=SZ;x1<=x2;x1>>=1,x2>>=1) { if(x1&1) get_pos2(y1,y2,v,x1++); if(~x2&1) get_pos2(y1,y2,v,x2--); } } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); TEST(freopen("input.txt","r",stdin)); TEST(freopen("output.txt","w",stdout)); TEST(freopen("debug.txt","w",stderr)); int N, M; priority_queue<pair<long long,int>> Q; long long ans; cin>>N>>M; A.resize(M); memset(dist,0x3f,sizeof(dist)); for(int i=0;i<M;i++) { auto &[t,l,r,aa,c]=A[i]; cin>>t>>l>>r>>c; if(l--==1) chk[i]=1; else if(r==N) chk[i]=2; x.emplace_back(l+t,i); x.emplace_back(r+t,i); y.emplace_back(l-t,i); y.emplace_back(r-t,i); t=l=r=aa=-1; } sort(x.begin(),x.end()); sort(y.begin(),y.end()); for(int i=0;i<2*M;i++) { if(get<0>(A[x[i].second])==-1) get<0>(A[x[i].second])=i; else get<2>(A[x[i].second])=i; if(get<1>(A[y[i].second])==-1) get<1>(A[y[i].second])=i; else get<3>(A[y[i].second])=i; lx[i]=i && x[i-1].first==x[i].first ? lx[i-1]:i; ly[i]=i && y[i-1].first==y[i].first ? ly[i-1]:i; } rx[2*M-1]=ry[2*M-1]=2*M-1; for(int i=2*M-1;--i>=0;) { rx[i]=x[i].first==x[i+1].first ? rx[i+1]:i; ry[i]=y[i].first==y[i+1].first ? ry[i+1]:i; } for(int i=0;i<M;i++) if(chk[i]!=1) { auto[x1,y1,x2,y2,c]=A[i]; set_tree(x1,y1,c); set_tree(x2,y1,c); set_tree(x1,y2,c); set_tree(x2,y2,c); } for(int i=0;i<M;i++) if(chk[i]==1) { auto[x1,y1,x2,y2,c]=A[i]; dist[i]=c; ans=get_min(lx[x1],ly[y1],rx[x2],ry[y2]); if(ans<INF) Q.emplace(-dist[i]-ans,i); } while(!Q.empty()) { auto[t,c]=Q.top(); Q.pop(); auto[x1,y1,x2,y2,d]=A[c]; ans=get_min(lx[x1],ly[y1],rx[x2],ry[y2]); if(-t!=dist[c]+ans) { if(ans<INF) Q.emplace(-dist[c]-ans,c); continue; } get_pos(lx[x1],ly[y1],rx[x2],ry[y2],ans); for(auto n: P) { auto[x1,y1,x2,y2,nc]=A[n]; dist[n]=dist[c]+nc; assert(nc==ans); set_tree(x1,y1,INF); set_tree(x2,y1,INF); set_tree(x1,y2,INF); set_tree(x2,y2,INF); } for(auto n: P) { auto[x1,y1,x2,y2,nc]=A[n]; ans=get_min(lx[x1],ly[y1],rx[x2],ry[y2]); if(ans<INF) Q.emplace(-dist[n]-ans,n); } ans=get_min(lx[x1],ly[y1],rx[x2],ry[y2]); if(ans<INF) Q.emplace(-dist[c]-ans,c); } ans=LINF; for(int i=0;i<M;i++) if(chk[i]==2) ans=min(ans,dist[i]); cout<<(ans<LINF ? ans:-1)<<'\n'; 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...