제출 #981516

#제출 시각아이디문제언어결과실행 시간메모리
9815168pete8사이버랜드 (APIO23_cyberland)C++17
97 / 100
2426 ms110584 KiB
#include "cyberland.h" #include<iostream> #include<stack> #include<map> #include<vector> #include<string> #include<unordered_map> #include <queue> #include<cstring> #include<limits.h> #include <cassert> #include<cmath> #include<set> #include<algorithm> #include <iomanip> #include<numeric> //gcd(a,b) #include<bitset> #include <cstdlib> #include <cstdint> using namespace std; #define ll long long #define f first //#define endl "\n" #define s second #define pii pair<int,int> #define ppii pair<int,pii> #define vi vector<int> #define pb push_back #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define F(n) for(int i=0;i<n;i++) #define lb lower_bound #define ub upper_bound #define fastio ios::sync_with_stdio(false);cin.tie(NULL); #pragma GCC optimize ("03,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") using namespace std; #define int long long #define double long double const int inf=1e18,mxn=1e5; double pre=1e-7; struct info{ double cost; int cur,use,bro; bool operator<(info a)const{return (cost>a.cost);}; }; vector<pii>adj[mxn+10]; double what[mxn+10][31][2]; double_t solve(int32_t n,int32_t m,int32_t k,int32_t H,vector<int32_t>x,vector<int32_t>y,vector<int32_t>c,vector<int32_t> arr){ k=min(k,30); //why is it passing sub 2 but not sub 3??? for(int i=0;i<n;i++)adj[i].clear(); //for(int i=0;i<n;i++)for(int j=0;j<=k;j++)for(int g=0;g<2;g++)dist[i][j][g]=inf; for(int i=0;i<m;i++){ adj[x[i]].pb({y[i],c[i]}); adj[y[i]].pb({x[i],c[i]}); } adj[H].clear();//cant move //double ans=inf; for(int i=0;i<n;i++)for(int j=0;j<=k;j++)for(int g=0;g<2;g++)what[i][j][g]=inf; what[0][0][0]=0; priority_queue<info>pq; pq.push({0,0,0,0}); double ans=inf; while(!pq.empty()){ int cur=pq.top().cur,use=pq.top().use,bro=pq.top().bro; double cost=pq.top().cost; pq.pop(); if(cur==H)ans=min(ans,cost); if(what[cur][use][bro]<cost)continue; if(arr[cur]==2&&use<k&&bro==0){ double a=(cost*1.0)/2; if(what[cur][use+1][1]>a){ what[cur][use+1][1]=a; pq.push((info){what[cur][use+1][1],cur,use+1,1}); } } for(auto i:adj[cur]){ if(what[cur][use][bro]+i.s<what[i.f][use][0]){ double a=cost+i.s; what[i.f][use][0]=a; if(arr[i.f]==0)what[i.f][use][0]=0; pq.push((info){what[i.f][use][0]*1.0,i.f,use,0}); } } } if(ans==inf)return -1; return ans; /* dist[0][0][0]=0; priority_queue<info>pq; pq.push({0,0,0,0}); for(int i=0;i<n;i++){ if(arr[i]==0){ for(int j=0;j<=k;j++)pq.push({0,i,j,0}),dist[i][j][0]=0; } } while(!pq.empty()){ info cur=pq.top(); pq.pop(); if(cur.cur==H)ans=min(ans,cur.cost); if(dist[cur.cur][cur.use][cur.bro]!=cur.cost)continue; if(arr[cur.cur]==2&&cur.use<k&&cur.bro==0){ double cost=(cur.cost*1.0/2); if(dist[cur.cur][cur.use+1][1]>cost){ dist[cur.cur][cur.use+1][1]=cost; pq.push({cost,cur.cur,cur.use+1,1}); } } for(auto i:adj[cur.cur]){ double a=cur.cost+i.s; if(a<dist[i.f][cur.use][0]){ dist[i.f][cur.use][0]=a; pq.push({a,i.f,cur.use,0}); } } } if(ans==inf)return -1; return ans;*/ } #undef int /* int32_t main(){ int t;cin>>t; int n,m,k,h;cin>>n>>m>>k>>h; vector<int>x(m),y(m),z(m),arr(n); for(int i=0;i<n;i++)cin>>arr[i]; for(int i=0;i<m;i++)cin>>x[i]>>y[i]>>z[i]; cout<<solve(n,m,k,h,x,y,z,arr); }*/ /* 1 4 4 30 3 1 1 2 1 0 1 5 0 2 4 1 3 2 2 3 4 */
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...