# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
124620 |
2019-07-03T15:14:13 Z |
johutha |
OBELISK (NOI14_obelisk) |
C++14 |
|
100 ms |
13148 KB |
#include <iostream>
#include <vector>
#include <algorithm>
#define int int64_t
using namespace std;
int k;
struct layer
{
vector<vector<int>> way;
vector<pair<int,int>> in;
vector<pair<int,int>> out;
int is, os;
int calcdist(int fr, int to)
{
if (k == 1) return abs(in[fr].first - out[to].first) + abs(in[fr].second - out[to].second);
int ix = in[fr].first, iy = in[fr].second, ox = out[to].first, oy = out[to].second;
int diffx = abs(ix - ox), diffy = abs(iy - oy);
int l = k + 1;
int hrm = 0;
int vrm = 0;
int hm = diffx / l;
int vm = diffy / l;
if (diffx % l > l - (diffx % l)) hm++;
if (diffy % l > l - (diffy % l)) vm++;
hrm = min(l - (diffx % l), diffx % l);
vrm = min(l - (diffy % l), diffy % l);
if (vrm && hm == 0) hm++;
if (hrm && vm == 0) vm++;
//cout << hm << " " << hrm << " " << vm << " " << vrm << "\n";
return 2*vm + hrm + 2*hm + vrm;
}
void calcways()
{
way.resize(is, vector<int>(os));
for (int i = 0; i < is; i++)
{
for (int j = 0; j < os; j++)
{
way[i][j] = calcdist(i, j);
}
}
}
};
signed main()
{
int fl;
cin >> fl >> k;
int sx, sy, ex, ey;
cin >> sx >> sy >> ex >> ey;
vector<layer> layers;
if (fl != 1)
{
for (int i = 0; i < fl - 1; i++)
{
int s;
cin >> s;
vector<pair<int,int>> ip(s);
for (int h = 0; h < s; h++)
{
cin >> ip[h].first >> ip[h].second;
}
layer l;
if (i == 0)
{
l.is = 1;
l.in.push_back({sx, sy});
}
else
{
l.is = layers.back().os;
l.in = layers.back().out;
}
l.os = s;
l.out = ip;
layers.push_back(l);
}
layer l;
l.is = layers.back().os;
l.in = layers.back().out;
l.os = 1;
l.out = {{ex, ey}};
layers.push_back(l);
}
else
{
layer l;
l.is = 1;
l.os = 1;
l.in = {{sx, sy}};
l.out = {{ex, ey}};
layers.push_back(l);
}
for (auto &la : layers)
{
la.calcways();
}
vector<int> fast(1, 0);
for (int i = 0; i < fl; i++)
{
layer cl = layers[i];
vector<int> nfast(cl.os);
for (int o = 0; o < cl.os; o++)
{
int mmin = 1e12;
for (int in = 0; in < cl.is; in++)
{
mmin = min(mmin, cl.way[in][o] + fast[in]);
}
nfast[o] = mmin;
}
fast = nfast;
}
cout << fast[0] << "\n";
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
376 KB |
Output is correct |
3 |
Correct |
2 ms |
256 KB |
Output is correct |
4 |
Correct |
2 ms |
376 KB |
Output is correct |
5 |
Correct |
2 ms |
256 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
504 KB |
Output is correct |
2 |
Correct |
4 ms |
504 KB |
Output is correct |
3 |
Correct |
4 ms |
632 KB |
Output is correct |
4 |
Correct |
5 ms |
760 KB |
Output is correct |
5 |
Correct |
3 ms |
504 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
86 ms |
11356 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
97 ms |
12204 KB |
Output is correct |
2 |
Correct |
94 ms |
11896 KB |
Output is correct |
3 |
Correct |
95 ms |
12024 KB |
Output is correct |
4 |
Correct |
100 ms |
13148 KB |
Output is correct |
5 |
Correct |
94 ms |
12280 KB |
Output is correct |