# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
173709 | juggernaut | K-th path (IZhO11_kthpath) | C++14 | 38 ms | 34808 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//Just try and the idea will come
#include<bits/stdc++.h>
#define int long long int
using namespace std;
set<pair<string,pair<int,int>>>st;
int n,m,i,j,x,y,dp[31][31],k;
string val,dis[31][31][31][31],res="";
pair<int,int>path[31][31][31][31],nxt[31][31][31][31];
char a[31][31];
main(){
cin>>n>>m;
dp[1][1]=1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
cin>>a[i][j];
dp[i][j]+=dp[i-1][j]+dp[i][j-1];
for(int ii=1;ii<=n;ii++)
for(int jj=1;jj<=m;jj++)dis[i][j][ii][jj]="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
}
cin>>k;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
dis[i][j][i][j]="";
dis[i][j][i][j]+=a[i][j];
st.insert({dis[i][j][i][j],{i,j}});
while(!st.empty()){
auto v=*st.begin();
x=v.second.first;
y=v.second.second;
val=v.first;
st.erase(st.begin());
if(x+1<=n&&val+a[x+1][y]<dis[i][j][x+1][y]){
st.erase({dis[i][j][x+1][y],{x+1,y}});
dis[i][j][x+1][y]=val+a[x+1][y];
path[i][j][x+1][y]={x,y};
st.insert({dis[i][j][x+1][y],{x+1,y}});
}
if(y+1<=m&&val+a[x][y+1]<dis[i][j][x][y+1]){
st.erase({dis[i][j][x][y+1],{x,y+1}});
dis[i][j][x][y+1]=val+a[x][y+1];
path[i][j][x][y+1]={x,y};
st.insert({dis[i][j][x][y+1],{x,y+1}});
}
}
x=n,y=m;
while(x&&y){
pair<int,int>tmp={x,y};
int xx=x;
x=path[i][j][x][y].first;
y=path[i][j][xx][y].second;
nxt[i][j][x][y]=tmp;
}}
x=y=1;
while(!(x==n&&y==m)){
i=nxt[x][y][x][y].first;
j=nxt[x][y][x][y].second;
res+=a[x][y];
if(k>dp[n-i+1][m-j+1]){
k-=dp[n-i+1][m-j+1];
if(i==x+1)y++;
else x++;
}else{
x=i,y=j;
}
}
res+=a[n][m];
cout<<res;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |