# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
962253 | Ice_man | 웜뱃 (IOI13_wombats) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/**
____ ____ ____ __________________ ____ ____ ____
||I || ||c || ||e || || || ||M || ||a || ||n ||
||__|| ||__|| ||__|| ||________________|| ||__|| ||__|| ||__||
|/__\| |/__\| |/__\| |/________________\| |/__\| |/__\| |/__\|
*/
//#include"wombats.h"
#include <set>
#include <iostream>
#include <chrono>
#include <vector>
#include <algorithm>
#include <cstdio>
#define maxn 5005
#define maxn2 205
#define maxlog 20
#define INF 1000000010
#define LINF 1000000000000000005
#define endl '\n'
#define pb(x) push_back(x)
#define X first
#define Y second
#define control cerr<<"passed"<<endl;
#pragma GCC optimize("O3" , "Ofast" , "unroll-loops" , "fast-math")
#pragma GCC target("avx2")
using namespace std;
/**std::chrono::high_resolution_clock::time_point startT, currT;
constexpr double TIME_MULT = 1;
double timePassed()
{
using namespace std::chrono;
currT = high_resolution_clock::now();
double time = duration_cast<duration<double>>(currT - startT).count();
return time * TIME_MULT;
}*/
typedef pair <long long, int> pli;
int d[maxn];
int c, r;
int h[maxn][maxn2];
int v[maxn][maxn2];
//int dp[maxn][maxn2];
/**void dijkstra(int node)
{
for(int i = 0; i < c; i++)
d[i] = 1e9;
d[node] = 0;
for(int j = 0; j < r; j++)
{
set <int> q;
for(int i = 0; i < c; i++)
if(d[i] != 1e9)
q.emplace(i);
while(q.size())
{
int e = *q.begin();
q.erase(q.begin());
if(e + 1 < c)
if(d[e + 1] > d[e] + h[j][e])
{
d[e + 1] = d[e] + h[j][e];
q.emplace(e + 1);
}
if(e >= 1)
if(d[e - 1] > d[e] + h[j][e - 1])
{
d[e - 1] = d[e] + h[j][e - 1];
q.emplace(e - 1);
}
}
if(j + 1 < r)
for(int i = 0; i < c; i++)
d[i] += v[j][i];
}
for(int i = 0; i < c; i++)
dp[node][i] = d[i];
}*/
int dp[5001][5001][201];
void calc_dp(int k)
{
for(int i = 0; i < r; i++)
for(int j = 0; j < c; j++)
dp[k][j][i] = 1e9;
dp[k][k][0] = 0;
for(int i = 1; i < c; i++)
dp[k][i][0] = min(dp[k][i][0] , dp[k][i - 1][0] + h[0][i - 1]);
for(int i = c - 2; i > -1; i--)
dp[k][i][0] = min(dp[k][i][0] , dp[k][i + 1][0] + h[0][i]);
for(int i = 1; i < r; i++)
{
for(int j = 0; j < c; j++)
dp[k][j][i] = dp[k][j][i - 1] + v[i - 1][j];
for(int ii = 1; ii < c; ii++)
dp[k][ii][i] = min(dp[k][ii][i] , dp[k][ii - 1][i] + h[i][ii - 1]);
for(int ii = c - 2; ii > -1; ii--)
dp[k][ii][i] = min(dp[k][ii][i] , dp[k][ii + 1][i] + h[i][ii]);
}
}
void init(int R, int C, int H[5000][200], int V[5000][200])
{
r = R;
c = C;
for(int i = 0; i < r; i++)
for(int j = 0; j < c; j++)
{
if(j + 1 < c)
h[i][j] = H[i][j];
if(i + 1 < r)
v[i][j] = V[i][j];
}
for(int i = 0; i < c; i++)
calc_dp(i);
}
void changeH(int P , int Q , int W)
{
h[P][Q] = W;
for(int i = 0; i < c; i++)
calc_dp(i);
}
void changeV(int P , int Q , int W)
{
v[P][Q] = W;
for(int i = 0; i < c; i++)
calc_dp(i);
}
int escape(int V1 , int V2)
{
return dp[V1][V2][r - 1];
}
/**int main()
{
#ifdef ONLINE_JUDGE /// promeni
freopen("input.in", "r", stdin);
freopen("taxi.out", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
//startT = std::chrono::high_resolution_clock::now();
return 0;
}*/