Submission #66110

#TimeUsernameProblemLanguageResultExecution timeMemory
66110khohkoDungeon 2 (JOI16_dungeon2)C++17
100 / 100
32 ms4092 KiB
#include "dungeon2.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define fr first #define sc second #define ARRS ((ll)(2e6+100)) #define MAX ((ll)(1e9+100)) #define MOD ((ll)(1e9+7)) //void Inspect(int R); //void Answer(int D, int A); //void Move(int I, int V); //int NumberOfRoads(); //int LastRoad(); //int Color(); #define num NumberOfRoads #define lst LastRoad #define clr Color stack<ll> g; vector<pair<ll,ll> > v[400]; ll C=1; ll pr[400]; ll nm[400]; void mvb(){ ll t=g.top(); g.pop(); if(t>=0)Move(t,clr()); } ll n=0; ll f[400][400]; ll ef[700][700]; ll go(ll f){ g.push(LastRoad()); ll k=Color(); if(k==2){mvb(); return 0;} if(k==3){mvb(); return -1;} n++; ll x=n; pr[x]=lst(); if(f)v[x].pb({f,pr[x]}); ll m=num(); nm[x]=m; for(int i=1; i<=m; i++){ if(i==g.top())continue; Move(i,2); ll k=go(x); if(k==-1)ef[x][i]=1; if(k>0)v[x].pb({k,i}); } ll t=g.top(); g.pop(); if(t>=0)Move(t,3); return x; } ll dp[400][400]; ll bk[400][400]; ll pw[400]; ll pas[400]; ll cr; ll gc(ll x){ return (x/pw[cr])%3+1; } ll gcc(ll x){ return (x/pw[cr+1])%3+1; } vector<ll> ord; ll out[400]; //void dfs(ll x){ // for(auto y:v[x]){ // if(y.sc==pr[x])continue; // Move(y.sc,gc(x)); // dfs(y.fr); // } // if(pr[x]>=0) // Move(pr[x],gc(x)); //} void slv(ll x){ for(auto y:v[x]){ if(y.sc==pr[x])continue; Move(y.sc,gc(x)); slv(y.fr); } for(int i=1; i<=num(); i++){ if(ef[x][i])continue; Move(i,clr()); f[x][i]+=(clr()-1)*pw[cr]; bk[x][i]=lst(); Move(lst(),clr()); } if(pr[x]>=0) Move(pr[x],gc(x)); } void Inspect(int R) { // string s="ITO"; // for(int i=0; i<s.size(); i++)s[i]=s[i]-'A'+'a'; // cout<<s<<endl; // return; go(0); for(int i=1; i<=n; i++){ for(auto x:v[i]){ ef[i][x.sc]=1; f[i][x.sc]=x.fr; } } pw[0]=1; for(int i=1; i<15; i++)pw[i]=pw[i-1]*3; // dfs(1); for(cr=0; pw[cr]-1<n+1; cr++) slv(1); //reverse(ord.begin(),ord.end()); for(int i=1; i<=n; i++) for(int j=1; j<=nm[i]; j++){ if(ef[i][j])continue; f[f[i][j]][bk[i][j]]=i; } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) dp[i][j]=MAX; for(int i=1; i<=n; i++) for(int j=1; j<=nm[i]; j++) dp[i][f[i][j]]=1; for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); for(int i=1; i<=n; i++) for(int j=i+1; j<=n; j++) pas[dp[i][j]]++; for(int i = 1; i <= R; i++) Answer(i, pas[i]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...