답안 #623531

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
623531 2022-08-05T19:01:55 Z inksamurai Jetpack (COCI16_jetpack) C++17
80 / 80
84 ms 27216 KB
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define rng(i,c,n) for(int i=c;i<n;i++)
#define fi first
#define se second
#define pb push_back
#define sz(a) (int)a.size()
#define vec(...) vector<__VA_ARGS__>
#define _3SgiE60 ios::sync_with_stdio(0),cin.tie(0)
typedef long long ll;
using pii=pair<int,int>;
using vi=vector<int>;
void print(){cout<<'\n';}
template<class h,class...t>
void print(const h&v,const t&...u){cout<<v<<' ',print(u...);}
// e
 
const int inf=100010;
 
signed main(){
_3SgiE60;
	const int h=10;
	int w;
	cin>>w;
	vec(vec(char)) a(h,vec(char)(w));
	rep(i,h){
		rep(j,w){
			cin>>a[i][j];
		}
	}
	auto ok=[&](int x,int y){
		return min(x,y)>=0 and x<h and y<w;
	};
	const int di[]={-1,1};
	const int dj[]={1,1};
	using T=pair<int,pii>;
	vec(vec(T)) dp(h,vec(T)(w));
	rep(i,h){
		rep(j,w){
			dp[i][j]={inf,{-1,-1}};
		}
	}
	auto affine=[&](int sx,int sy,int val,int x,int y,int ad)->void{
		val+=ad;
		if(dp[sx][sy].fi>val){
			dp[sx][sy].fi=val;
			dp[sx][sy].se={x,y};
		}
	};
	auto dfs=[&](auto self,int x,int y)->int{
		assert(a[x][y]=='.');
		if(dp[x][y].fi!=inf) return dp[x][y].fi;
		if(y==w-1) return dp[x][y].fi=0;
		dp[x][y].fi=inf-1;
		int sx=x,sy=y;
		rep(_,w){
			x+=di[0],y+=dj[0];
			x=max(x,0);
			if(ok(x,y) and a[x][y]=='.'){
				int nval=self(self,x,y);
				if(nval<=w){
					affine(sx,sy,nval,x,y,1);
				}
			}else{
				break;
			}
		}
		x=sx,y=sy;
		x+=di[1],y+=dj[1];
		x=min(x,h-1);
		if(ok(x,y) and a[x][y]=='.'){
			int nval=self(self,x,y);
			if(nval<=w){
				affine(sx,sy,nval,x,y,0);
			}
		}
		return dp[sx][sy].fi;
	};
	dfs(dfs,h-1,0);
	int x=h-1,y=0;
	assert(dp[x][y].fi<inf-1);
	cout<<dp[x][y].fi<<"\n";
	while(y<w-1){
		// print(x,y);
		int nx,ny;
		nx=dp[x][y].se.fi,ny=dp[x][y].se.se;
		if(nx==-1 and ny==-1) break;
		if(nx<x){
			cout<<y<<" "<<ny-y<<"\n";
		}
		x=nx,y=ny;
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 7 ms 468 KB Output is correct
5 Correct 27 ms 1492 KB Output is correct
6 Correct 24 ms 2068 KB Output is correct
7 Correct 25 ms 5532 KB Output is correct
8 Correct 71 ms 13212 KB Output is correct
9 Correct 84 ms 19752 KB Output is correct
10 Correct 54 ms 27216 KB Output is correct