QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#61013 | #3514. Bouldering | abdelrahman001 | TL | 0ms | 0kb | C++20 | 2.1kb | 2022-11-09 05:13:56 | 2022-11-09 05:13:59 |
Judging History
answer
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
typedef long long ll;
typedef long double ld;
using namespace std;
const int N = 50 + 5;
const int M = 6e3 + 5;
int n, m, r, s, mn = 1e9;
ld d[N][N][M];
char a[N][N];
vector<array<int, 3>> g[N][N];
int sqr(int x) {
return x * x;
}
ld dij(int i, int j) {
priority_queue<pair<ld, array<int, 3>>> q;
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
for(int k = 0;k < M;k++)
d[i][j][k] = 1e9;
}
}
int c = a[i][j] - '0';
d[i][j][c] = 0;
q.push({0, {c, i, j}});
while(!q.empty()) {
ld dis = -q.top().first;
int curi = q.top().second[1];
int curj = q.top().second[2];
int curs = q.top().second[0];
q.pop();
if(d[curi][curj][curs] < dis)
continue;
if(curi == mn)
return dis;
for(auto k : g[curi][curj]) {
int ni = k[0];
int nj = k[1];
ld ndis = dis + sqrt(k[2]);
int c = a[ni][nj] - '0';
if(c + curs > s)
continue;
int cs = c + curs;
if(ndis < d[ni][nj][cs]) {
d[ni][nj][cs] = ndis;
q.push({-ndis, {cs, ni, nj}});
}
}
}
return 1e15;
}
int main() {
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin >> n >> m >> r >> s;
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
cin >> a[i][j];
if(a[i][j] != '.')
mn = min(mn, i);
}
}
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
for(int x = 0;x < n;x--) {
for(int y = 0;y < m;y++) {
if(a[i][j] == '.' || a[x][y] == '.')
continue;
if(x == i && y == j)
continue;
int dis = sqr(i - x) + sqr(j - y);
if(dis > sqr(r))
continue;
g[i][j].push_back({x, y, dis});
g[x][y].push_back({i, j, dis});
}
}
}
}
for(int i = n - 1;i >= 0;i--) {
for(int j = 0;j < m;j++) {
if(a[i][j] != '.') {
ld ans = dij(i, j);
if(ans == 1e15)
cout << "impossible";
else
cout << fixed << setprecision(9) << ans << endl;
return 0;
}
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Time Limit Exceeded
input:
12 11 3 11 ........... ........3.. .......3.1. ........... .......2... .....2..... .1.1....... .....2..... .1......... ...2....... .1......... ...........