Submission #988787

#TimeUsernameProblemLanguageResultExecution timeMemory
988787vjudge1Cyberland (APIO23_cyberland)C++17
97 / 100
665 ms1115116 KiB
#include <algorithm> #include <queue> const int Nx=100010; const double inf=1e24; int n,m,k,h,ab[Nx]; struct edge{int to,nex,val,typ;}; edge a[300*Nx]; int head[75*Nx],cnt; void add(int u,int v,int w,int t) { a[++cnt]=edge{v,head[u],w,t}; head[u]=cnt; } struct node { int idx;double val; bool operator < (const node &x) const { if(idx/n!=x.idx/n) return idx/n>x.idx/n; return val>x.val; } }; int id(int x,int lev){return x+lev*n;} void find_zpair(int p) { ab[p]=1; int i; for(i=head[p];i;i=a[i].nex) { if(ab[a[i].to]==0&&p!=h) find_zpair(a[i].to); } } double dis[75*Nx]; int fin[75*Nx]; void clear_all() { int i; for(i=0;i<n;i++) ab[i]=0; for(i=0;i<=(k+1)*n+1;i++) head[i]=dis[i]=fin[i]=0; cnt=n=m=k=h=0; } double solve(int N,int M,int K,int H,std::vector<int> X,std::vector<int> Y,std::vector<int> C,std::vector<int> arr) { clear_all(); n=N,m=M,k=K,h=H; int i,j,now,fx,fy; for(i=0;i<M;i++) { add(X[i],Y[i],C[i],1); add(Y[i],X[i],C[i],1); } find_zpair(0); if(ab[H]==0) return -1; for(i=0;i<=N;i++) head[i]=0; cnt=0; for(i=0;i<M;i++) { for(j=0;j<=K;j++) { if(X[i]!=H) add(id(X[i],j),id(Y[i],j),C[i],1); if(Y[i]!=H) add(id(Y[i],j),id(X[i],j),C[i],1); if(j!=K&&X[i]!=H&&arr[Y[i]]==2) add(id(X[i],j),id(Y[i],j+1),C[i],2); if(j!=K&&Y[i]!=H&&arr[X[i]]==2) add(id(Y[i],j),id(X[i],j+1),C[i],2); } } for(i=0;i<=(K+1)*N+1;i++) dis[i]=inf,fin[i]=0; std::priority_queue<node> hea; for(i=0;i<N;i++) { if(arr[i]==0&&ab[i]==1) { hea.push(node{i,0}); dis[i]=0; } } hea.push(node{0,0}); dis[0]=0; while(hea.size()) { node ax=hea.top(); hea.pop(); now=ax.idx; if(fin[now]) continue; fin[now]=1; for(i=head[now];i;i=a[i].nex) { if(dis[a[i].to]>(dis[now]+a[i].val)/a[i].typ) { dis[a[i].to]=(dis[now]+a[i].val)/a[i].typ; if(!fin[a[i].to]) hea.push(node{a[i].to,dis[a[i].to]}); } } } double ans=inf; for(i=0;i<=K;i++) ans=std::min(ans,dis[id(H,i)]); return ans; }

Compilation message (stderr)

cyberland.cpp: In function 'double solve(int, int, int, int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
cyberland.cpp:50:14: warning: unused variable 'fx' [-Wunused-variable]
   50 |  int i,j,now,fx,fy;
      |              ^~
cyberland.cpp:50:17: warning: unused variable 'fy' [-Wunused-variable]
   50 |  int i,j,now,fx,fy;
      |                 ^~
#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...