Submission #497267

#TimeUsernameProblemLanguageResultExecution timeMemory
497267DanerZein던전 (IOI21_dungeons)C++17
0 / 100
3 ms972 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=5e4+10; vector<ll> pw,pl,Gw,Gl; int nd; map<int,int> m,m1; bool ci[MAX_N]; int in[MAX_N]; ll sum[MAX_N]; int en[MAX_N],sta[MAX_N]; int dis[MAX_N]; int no=0; ll sc; vector<ll> cis; int ciclo(int u){ if(ci[u]) return u; ci[u]=1; return ciclo(Gl[u]); } int dfs(int x,int p,int s,bool sw){ if(ci[x]!=sw || m[x]!=-1) return m[p]; m[x]=no; m1[no]=x; no++; int u=m[x]; sum[u]=sum[m[p]]+pl[x]; sta[u]=m[s]; return en[u]=dfs(Gl[x],x,s,sw); } int distan(int u){ if(u==nd) return 0; int x=m[u]; if(dis[x]!=-1) return dis[x]; return dis[x]=distan(Gw[u])+1; } void init(int n, std::vector<int> s, std::vector<int> p, std::vector<int> w, std::vector<int> l) { memset(in,0,sizeof in); memset(ci,0,sizeof ci); memset(dis,-1,sizeof dis); nd=n; sc=s[0]; for(int i=0;i<n;i++){ m[i]=-1; pw.push_back(s[i]); pl.push_back(p[i]); Gw.push_back(w[i]); Gl.push_back(l[i]); in[l[i]]++; } int cu=ciclo(0); memset(ci,0,sizeof ci); ciclo(cu); for(int i=0;i<n;i++){ if(in[i]==0){ dfs(i,i,i,ci[i]); } } for(int i=0;i<n;i++){ if(ci[i]) dfs(i,i,i,ci[i]); } for(int i=0;i<n;i++){ if(dis[m[i]]==-1) { distan(i); } } // for(auto &v:m) cout<<v.first<<": "<<v.second<<endl; } int binary(int l,int r,int z,int a){ // int l=u,r=en[u]+1; int d; while(r-l>1){ int mid=(l+r)/2; d=sum[mid]-a; if(z+d>=sc) r=mid; else l=mid; } d=sum[l]-a; if(z+d>=sc) r=l; return r; } long long simulate(int x, int z) { int u=m[x]; int a=0; if(u!=sta[u]) a=sum[u-1]; int d=sum[en[u]]-a; if(z+d>=sc){ u=binary(u,en[u]+1,z,a); } else{ z+=d; //u=m[Gw[en[u]]]; int vu=(sc-z)/sum[en[u]]; z+=vu*sum[en[u]]; if(u==sta[u]) a=0; else a=sum[u-1]; if(z+sum[en[u]]-a>=sc){ u=binary(u,en[u]+1,z,a); z+=sum[u]-a; } else{ z+=sum[en[u]]-a; u=binary(sta[u],u,z,a); z+=sum[u]; } } u=m[Gw[m1[u]]]; z+=sc*dis[u]; return z; }
#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...