QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#827091 | #9879. ReTravel | ucup-team3519# | TL | 0ms | 3668kb | C++17 | 2.7kb | 2024-12-22 19:17:04 | 2024-12-22 19:17:05 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define V vector
#define pb push_back
#define fi first
#define se second
#define all0(x) (x).begin(), (x).end()
#define all1(x) (x).begin() + 1, (x).end()
typedef long long LL;
typedef pair<int, int> pi;
mt19937 mrand(chrono::steady_clock().now().time_since_epoch().count());
void solve() {
int n;
cin >> n;
n++;
V<int> uni_x(1), uni_y(1);
V<int> x(n + 1), y(n + 1);
for (int i = 2; i <= n; i++) cin >> x[i] >> y[i];
for (int i = 1; i <= n; i++) {
uni_x.pb(x[i]);
uni_y.pb(y[i]);
}
sort(all1(uni_x));
uni_x.erase(unique(all1(uni_x)), uni_x.end());
sort(all1(uni_y));
uni_y.erase(unique(all1(uni_y)), uni_y.end());
for (int i = 1; i <= n; i++)
x[i] = lower_bound(all1(uni_x), x[i]) - uni_x.begin();
for (int i = 1; i <= n; i++)
y[i] = lower_bound(all1(uni_y), y[i]) - uni_y.begin();
int a = uni_x.size() - 1, b = uni_y.size() - 1;
V<V<V<int>>> to(a + 1, V<V<int>>(b + 1, V<int>(n + 1, -1)));
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
for (int k = n; k >= 1; k--) {
if (x[k] < i || y[k] < j) {
continue;
}
to[i][j][k] = k;
if (k != n)
to[i][j][k] = max(to[i][j][k], to[i][j][k + 1]);
}
}
}
const LL INFLL = 1e18;
V<V<V<LL>>> dp(a + 1, V<V<LL>>(b + 1, V<LL>(n + 1, INFLL)));
for (int task = n; task >= 1; task--) {
for (int i = a; i >= 1; i--) {
for (int j = b; j >= 1; j--) {
if (x[task] == i && y[task] == j) {
dp[i][j][task] =
(task == to[i][j][task] ? 0 : dp[i][j][task + 1]);
}
if (i != a) {
int t = to[i + 1][j][task];
dp[i][j][task] = min(
dp[i][j][task],
dp[i + 1][j][task] +
(t == to[i][j][task] ? 0 : dp[i][j][t + 1]) +
uni_x[i + 1] - uni_x[i]);
}
if (j != b) {
int t = to[i][j + 1][task];
dp[i][j][task] = min(
dp[i][j][task],
dp[i][j + 1][task] +
(t == to[i][j][task] ? 0 : dp[i][j][t + 1]) +
uni_y[j + 1] - uni_y[j]);
}
}
}
}
cout << dp[1][1][1] << "\n";
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
solve();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3628kb
input:
2 3 3 1 2
output:
6
result:
ok "6"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3668kb
input:
3 2 2 3 3 1 3
output:
7
result:
ok "7"
Test #3:
score: -100
Time Limit Exceeded
input:
500 906691059 413653999 813847339 955892128 451585301 43469773 278009742 548977048 521760889 434794718 985946604 841597326 891047768 325679554 511742081 384452587 626401695 957413342 975078788 234551094 541903389 149544006 302621084 150050891 811538590 101823753 663968655 858351976 268979133 9768326...