QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#61013#3514. Boulderingabdelrahman001TL 0ms0kbC++202.1kb2022-11-09 05:13:562022-11-09 05:13:59

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-11-09 05:13:59]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 0kb
  • [2022-11-09 05:13:56]
  • Submitted

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;
}

詳細信息

Test #1:

score: 0
Time Limit Exceeded

input:

12 11 3 11
...........
........3..
.......3.1.
...........
.......2...
.....2.....
.1.1.......
.....2.....
.1.........
...2.......
.1.........
...........

output:


result: