Submission #1300215

#TimeUsernameProblemLanguageResultExecution timeMemory
1300215KhoaDuyAesthetic (NOI20_aesthetic)C++20
35 / 100
2096 ms37284 KiB
#include<bits/allocator.h> #pragma GCC optimize("Ofast,unroll-loops") #pragma GCC target("avx2,fma,bmi,bmi2,popcnt,lzcnt,tune=native") #include<bits/stdc++.h> using namespace std; #define endl '\n' const int MAXN=3*1e5; struct we{ int u,v,w,wbuff; }; vector<vector<we>> graph; vector<long long> dijik(int s){ int n=graph.size()-1; priority_queue<pair<long long,int>> pq; vector<long long> dist; dist.assign(n+1,-1); dist[s]=0; pq.push({0,s}); while(!pq.empty()){ int u=pq.top().second; long long d=pq.top().first; pq.pop(); if(d>dist[u]){ continue; } for(we &x:graph[u]){ int v=x.v,w=x.w; if(dist[v]==-1||dist[v]>dist[u]+w){ dist[v]=dist[u]+w; pq.push({dist[v],v}); } } } return dist; } bool brid[MAXN]; int low[MAXN+1],in[MAXN+1],sum[MAXN+1]; int tim=1; vector<long long> d1,dn; int n; vector<we> edges; void DFS(int u,int p){ in[u]=tim; low[u]=tim; tim++; sum[u]=(u==1||u==n); for(we &x:graph[u]){ int v=x.v; if(v==p){ continue; } if(!in[v]){ DFS(v,u); sum[u]+=sum[v]; low[u]=min(low[u],low[v]); if(low[v]>in[u]&&sum[v]==1){ brid[x.w]=true; } } else{ low[u]=min(low[u],in[v]); } } } bool check(long long mid){ int m=edges.size(); graph.clear(),graph.resize(n+1); for(int i=0;i<m;i++){ int u=edges[i].u,v=edges[i].v,w=edges[i].w; if(d1[u]+dn[v]+w<=mid||d1[v]+dn[u]+w<=mid){ graph[u].push_back({u,v,i,0}); graph[v].push_back({v,u,i,0}); } } memset(brid,false,sizeof(brid)); for(int i=1;i<=n;i++){ in[i]=0; low[i]=0; sum[i]=0; } tim=1; DFS(1,-1); bool flag=false; for(int i=0;i+1<m;i++){ if(brid[i]){ int u=edges[i].u,v=edges[i].v,w=edges[i].w+edges[i].wbuff; if(d1[u]+dn[v]+w>mid&&d1[v]+dn[u]+w>mid){ flag=true; break; } } } return flag; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int m; cin >> n >> m; edges.resize(m); graph.resize(n+1); int bst=0; for(int i=0;i<m;i++){ int u,v,w; cin >> u >> v >> w; bst=max(bst,w); graph[u].push_back({u,v,w,0}); graph[v].push_back({v,u,w,0}); edges[i]={u,v,w,0}; } d1=dijik(1),dn=dijik(n); edges[m-1].wbuff=0; for(int i=m-2;i>=0;i--){ edges[i].wbuff=max(edges[i+1].wbuff,edges[i+1].w); } long long Low=d1[n],high=d1[n]+bst; Low--,high++; while(high-Low>1){ long long mid=((high-Low)>>1)+Low; if(check(mid)){ Low=mid; } else{ high=mid; } } cout << high; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...