This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
//#define int long long
using namespace std;
namespace G { // nodul 0 este o santinela la care se pointeaza in mod inutil (i.e. cand stergi din AINT)
deque<pair<int, int> > deq;
vector<int> time;
vector<vector<pair<int, int> > > g;
int push() { g.push_back(vector<pair<int, int> >()); return g.size() - 1; }
void push(int u, int v, int w) { // w ar trebui sa fie doar 1 sau 0
g[u].push_back({v, w});
g[v].push_back({u, w});
}
void pushdir(int u, int v, int w) { g[u].push_back({v, w}); }
int u, v;
int bdfs() {
if(deq.size() == 0)
return -1;
int x, t;
tie(x, t) = deq.front();
deq.pop_front();
if(t != time[x])
return bdfs();
//cerr << x << ' ' <<time[x] << '\n';
if(x == u || x == v)
return time[x];
for(auto [y, pt] : g[x]) {
if(time[y] > time[x] + pt || time[y] == -1) {
time[y] = time[x] + pt;
//cerr << "---> " << y << ' ' <<time[y] << '\n';
if(pt == 0)
deq.push_front({y, time[y]});
else
deq.push_back({y, time[y]});
}
}
return bdfs();
}
int start(int S, int T, int U, int V) {
deq.push_back({S, 1});
deq.push_back({T, 1});
tie(u, v) = {U, V};
time.resize(g.size(), -1);
time[S] = 1;
time[T] = 1;
return bdfs();
}
}
// x1, y1, x2, y2
vector<tuple<int,int,int,int> > squares;
namespace Norm {
multiset<int> app;
vector<tuple<int,int,int> > forb;
void make(vector<tuple<int,int,int,int> > &hor, int s, int t, int u, int v) {
for(auto [x1, y1, x2, y2] : squares) {
forb.emplace_back(x1, y1, y2);
forb.emplace_back(-x2, y1, y2);
}
forb.push_back({s, t, t});
forb.push_back({-s, t, t});
forb.push_back({-u, v, v});
forb.push_back({u, v, v});
sort(forb.begin(), forb.end(), [&](auto tp1, auto tp2) {
return abs(get<0>(tp1)) < abs(get<0>(tp2)) ||
(abs(get<0>(tp1)) == abs(get<0>(tp2)) && get<0>(tp1) > get<0>(tp2));
});
app.insert(0);
app.insert(1e9 + 1);
int ptr = 0, a, b, c, lin, col1, col2;
int temp;
for(auto [tlin, aaa, bbb] : forb) {
tlin = abs(tlin);
temp = ptr;
while(temp < forb.size() && abs(get<0>(forb[temp])) < tlin) {
tie(lin, col1, col2) = forb[temp];
if((abs(lin) == s || abs(lin) == u) && col1 == col2) {
temp++;
continue;
}
if(lin < 0) {
app.erase(col1);
app.erase(col2);
}
temp++;
}
temp = ptr;
while(ptr < forb.size() && abs(get<0>(forb[ptr])) < tlin) {
tie(a, b, c) = forb[ptr];
auto it = app.upper_bound(b);
hor.push_back({abs(a), *prev(it), *it, G::push()});
ptr++;
}
while(temp < ptr) {
tie(lin, col1, col2) = forb[temp];
if((abs(lin) == s || abs(lin) == u) && col1 == col2) {
temp++;
continue;
}
if(lin > 0) {
app.insert(col1);
app.insert(col2);
}
temp++;
}
}
temp = ptr;
while(temp < forb.size()) {
tie(lin, col1, col2) = forb[temp];
if((abs(lin) == s || abs(lin) == u) && col1 == col2) {
temp++;
continue;
}
if(lin < 0) {
app.erase(col1);
app.erase(col2);
}
temp++;
}
temp = ptr;
while(ptr < forb.size()) {
tie(a, b, c) = forb[ptr];
auto it = app.upper_bound(b);
hor.push_back({abs(a), *prev(it), *it, G::push()});
ptr++;
}
while(temp < ptr) {
tie(lin, col1, col2) = forb[temp];
if((abs(lin) == s || abs(lin) == u) && col1 == col2) {
temp++;
continue;
}
if(lin > 0) {
app.insert(col1);
app.insert(col2);
}
temp++;
}
forb.clear();
app.clear();
for(auto &[a1, b1, c1, d1] : squares)
swap(a1, b1), swap(c1, d1);
sort(hor.begin(), hor.end());
vector<tuple<int,int,int,int> > thor;
thor.push_back(hor[0]);
for(int i = 1; i < hor.size(); i++) {
if(get<0>(hor[i]) != get<0>(hor[i - 1]) || get<1>(hor[i]) != get<1>(hor[i - 1]) || get<2>(hor[i]) != get<2>(hor[i - 1]))
thor.push_back(hor[i]);
}
hor = move(thor);
}
map<int,int> mp[2];
int normalize(vector<tuple<int,int,int,int>>& hor, vector<tuple<int,int,int,int>>& ver) {
for(auto [poz, l, r, gid] : hor) { // init map
mp[1][l];
mp[1][r];
mp[0][poz];
}
for(auto [poz, l, r, gid] : ver) {
mp[0][l];
mp[0][r];
mp[1][poz];
}
int cnt = 1;
for(auto &x : mp[0])
x.second = cnt++;
cnt = 1;
for(auto &x : mp[1])
x.second = cnt++;
for(auto &[poz, l, r, gid] : hor) { // set to normalization
poz = mp[0][poz];
l = mp[1][l];
r = mp[1][r];
}
for(auto &[poz, l, r, gid] : ver) {
poz = mp[1][poz];
l = mp[0][l];
r = mp[0][r];
}
return max(mp[0].size(), mp[1].size());
}
}
namespace MKG {
namespace AINT {
vector<int> aint;
int n;
void update(int poz, int gid, int node = 1, int cl = 1, int cr = n) {
if(cl == cr) {
aint[node] = gid;
return;
}
int mid = cl + cr >> 1;
if(poz <= mid)
update(poz, gid, 2 * node, cl, mid);
else
update(poz, gid, 2 * node + 1, mid + 1, cr);
aint[node] = G::push();
G::pushdir(aint[node], aint[2 * node], 0);
G::pushdir(aint[node], aint[2 * node + 1], 0);
}
void linkto(int gid, int l, int r, int node = 1, int cl = 1, int cr = n) {
if(r < cl || cr < l)
return;
if(l <= cl && cr <= r) {
G::pushdir(gid, aint[node], 1);
return;
}
int mid = cl + cr >> 1;
linkto(gid, l, r, 2 * node, cl, mid);
linkto(gid, l, r, 2 * node + 1, mid + 1, cr);
}
void reset(int nlen) {
n = nlen + 1;
aint.resize(n * 4);
}
}
void start(vector<tuple<int,int,int,int> > ver, vector<tuple<int,int,int,int> > hor, int ASIZE) {
AINT::reset(ASIZE);
// 1 1 1 -- add
// -1 1 1 -- erase
vector<tuple<int,int,int> > qs;
for(auto [poz, l, r, gid] : ver) {
qs.push_back({l, poz, gid});
qs.push_back({-r - 1, poz, gid});
}
sort(qs.begin(), qs.end(), [&](auto tp1, auto tp2) {
return abs(get<0>(tp1)) < abs(get<0>(tp2)) ||
(abs(get<0>(tp1)) == abs(get<0>(tp2)) && get<0>(tp1) < get<0>(tp2));
});
int ptr = 0, a, l, r, tempid;
for(auto [line, poz, gid] : qs) {
while(ptr < hor.size() && get<0>(hor[ptr]) < abs(line)) {
tie(a, l, r, tempid) = hor[ptr];
//cerr << tempid << ' '<< l << ' ' << r << '\n';
AINT::linkto(tempid, l, r);
ptr++;
}
if(line < 0)
//cerr << "- " << poz << ' '<< gid << '\n',
AINT::update(poz, 0);
else
//cerr << "+ " << poz << ' '<< gid << '\n',
AINT::update(poz, gid);
}
while(ptr < hor.size()) {
tie(a, l, r, tempid) = hor[ptr];
AINT::linkto(tempid, l, r);
//cerr << tempid << ' '<< l << ' ' << r << '\n';
ptr++;
}
//cerr << '\n';
return;
}
}
// poz, [l, r], graphID
vector<tuple<int,int,int,int> > hor, ver;
signed main() {
int n;
int s, t, u, v;
cin >> s >> t >> u >> v >> n;
squares.resize(n);
for(auto &[x1, y1, x2, y2] : squares)
cin >> x1 >> x2 >> y1 >> y2;
G::push();
Norm::make(hor, s, t, u, v);
Norm::make(ver, t, s, v, u);
int S, T, U, V;
for(auto [poz, l, r, gid] : hor) {
if(poz == s && l <= t && t <= r)
T = gid;
if(poz == u && l <= v && v <= r)
V = gid;
}
for(auto [poz, l, r, gid] : ver) {
if(poz == t && l <= s && s <= r)
S = gid;
if(poz == v && l <= u && u <= r)
U = gid;
}
//cerr << "Horisontal:\n";
//for(auto [line, l, r, gid] : hor)
//cerr << line <<' ' << l << ' '<< r << ' ' << gid << '\n';
//cerr << "Vertical:\n";
//for(auto [line, l, r, gid] : ver)
//cerr << line <<' ' << l << ' '<< r << ' ' << gid << '\n';
int ASIZE = Norm::normalize(hor, ver);
//cerr << "Horisontal:\n";
//for(auto [line, l, r, gid] : hor)
//cerr << line <<' ' << l << ' '<< r << ' ' << gid << '\n';
//cerr << "Vertical:\n";
//for(auto [line, l, r, gid] : ver)
//cerr << line <<' ' << l << ' '<< r << ' ' << gid << '\n';
//cerr << "</>" << S << ' ' << T << ' ' << U << ' ' << V << '\n';
MKG::start(ver, hor, ASIZE);
MKG::start(hor, ver, ASIZE);
cout << G::start(S, T, U, V) << '\n';
}
Compilation message (stderr)
golf.cpp: In function 'int G::bdfs()':
golf.cpp:27:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
27 | for(auto [y, pt] : g[x]) {
| ^
golf.cpp: In function 'void Norm::make(std::vector<std::tuple<int, int, int, int> >&, int, int, int, int)':
golf.cpp:57:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
57 | for(auto [x1, y1, x2, y2] : squares) {
| ^
golf.cpp:73:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
73 | for(auto [tlin, aaa, bbb] : forb) {
| ^
golf.cpp:76:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
76 | while(temp < forb.size() && abs(get<0>(forb[temp])) < tlin) {
| ~~~~~^~~~~~~~~~~~~
golf.cpp:89:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
89 | while(ptr < forb.size() && abs(get<0>(forb[ptr])) < tlin) {
| ~~~~^~~~~~~~~~~~~
golf.cpp:109:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
109 | while(temp < forb.size()) {
| ~~~~~^~~~~~~~~~~~~
golf.cpp:122:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
122 | while(ptr < forb.size()) {
| ~~~~^~~~~~~~~~~~~
golf.cpp:142:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
142 | for(auto &[a1, b1, c1, d1] : squares)
| ^
golf.cpp:147:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, int, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
147 | for(int i = 1; i < hor.size(); i++) {
| ~~^~~~~~~~~~~~
golf.cpp: In function 'int Norm::normalize(std::vector<std::tuple<int, int, int, int> >&, std::vector<std::tuple<int, int, int, int> >&)':
golf.cpp:155:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
155 | for(auto [poz, l, r, gid] : hor) { // init map
| ^
golf.cpp:160:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
160 | for(auto [poz, l, r, gid] : ver) {
| ^
golf.cpp:171:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
171 | for(auto &[poz, l, r, gid] : hor) { // set to normalization
| ^
golf.cpp:176:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
176 | for(auto &[poz, l, r, gid] : ver) {
| ^
golf.cpp: In function 'void MKG::AINT::update(int, int, int, int, int)':
golf.cpp:194:20: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
194 | int mid = cl + cr >> 1;
| ~~~^~~~
golf.cpp: In function 'void MKG::AINT::linkto(int, int, int, int, int, int)':
golf.cpp:210:20: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
210 | int mid = cl + cr >> 1;
| ~~~^~~~
golf.cpp: In function 'void MKG::start(std::vector<std::tuple<int, int, int, int> >, std::vector<std::tuple<int, int, int, int> >, int)':
golf.cpp:224:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
224 | for(auto [poz, l, r, gid] : ver) {
| ^
golf.cpp:233:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
233 | for(auto [line, poz, gid] : qs) {
| ^
golf.cpp:234:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, int, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
234 | while(ptr < hor.size() && get<0>(hor[ptr]) < abs(line)) {
| ~~~~^~~~~~~~~~~~
golf.cpp:247:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, int, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
247 | while(ptr < hor.size()) {
| ~~~~^~~~~~~~~~~~
golf.cpp: In function 'int main()':
golf.cpp:267:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
267 | for(auto &[x1, y1, x2, y2] : squares)
| ^
golf.cpp:273:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
273 | for(auto [poz, l, r, gid] : hor) {
| ^
golf.cpp:279:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
279 | for(auto [poz, l, r, gid] : ver) {
| ^
golf.cpp:301:35: warning: 'U' may be used uninitialized in this function [-Wmaybe-uninitialized]
301 | cout << G::start(S, T, U, V) << '\n';
| ^~~~
golf.cpp:301:35: warning: 'S' may be used uninitialized in this function [-Wmaybe-uninitialized]
golf.cpp:301:35: warning: 'V' may be used uninitialized in this function [-Wmaybe-uninitialized]
golf.cpp:301:35: warning: 'T' may be used uninitialized in this function [-Wmaybe-uninitialized]
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |