#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <math.h>
#include <assert.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <algorithm>
#include <iostream>
#include <functional>
#include <unordered_set>
#include <bitset>
#include <time.h>
#include <limits.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define Fi first
#define Se second
#define pb(x) push_back(x)
#define szz(x) (int)x.size()
#define rep(i,n) for(int i=0;i<n;i++)
#define all(x) x.begin(),x.end()
typedef tuple<int, int, int> t3;
struct rect {
rect(){}
rect(int x1, int x2, int y1, int y2):x1(x1), y1(y1), x2(x2), y2(y2){}
int x1, x2, y1, y2;
};
struct seg {
seg(){}
seg(int x1, int x2, int y, int c) : x1(x1), x2(x2), y(y), c(c) {}
int x1, x2, y, c;
bool operator<(const seg &rhs)const {
if(y != rhs.y) return y < rhs.y;
return c < rhs.c;
}
};
pii LR[400040];
vector <seg> V;
vector <int> vx, vy;
rect P[100010];
int N, cs, LX;
int T[1<<19];
void update_t2(int rt, int l, int r, int s, int e, int val) {
if(s <= l && r <= e) {
T[rt] = val; return;
}
if(T[rt]) {
T[rt<<1] = T[rt];
T[rt<<1|1] = T[rt];
T[rt] = 0;
}
int m = (l + r) >> 1;
if(s <= m) update_t2(rt<<1, l, m, s, e, val);
if(m < e) update_t2(rt<<1|1, m+1, r, s, e, val);
}
int read_t2(int rt, int l, int r, int x) {
if(l == r) return T[rt];
if(T[rt] != 0) return T[rt];
int m = (l + r) >> 1;
if(x <= m) return read_t2(rt<<1, l, m, x);
else return read_t2(rt<<1|1, m+1, r, x);
}
void update_t(int l, int r, int val) {
if(l <= r) update_t2(1, 0, LX, l, r, val);
}
int read_t(int x) {
return read_t2(1, 0, LX, x);
}
void flip_xy() {
swap(vx, vy); for(int i=1;i<=N;i++) swap(P[i].x1, P[i].y1), swap(P[i].x2, P[i].y2);
}
void get_line(int cmd) {
for(int i=1;i<=N;i++) {
V.pb(seg(P[i].x1+1, P[i].x2-1, P[i].y2, 1));
V.pb(seg(P[i].x1, 4*i+cmd, P[i].y1, -1));
V.pb(seg(P[i].x2, 4*i+1+cmd, P[i].y1, -1));
}
sort(all(V));
for(auto &s : V) {
if(s.c < 0) {
LR[s.x2].Fi = read_t(s.x1);
}
else {
update_t(s.x1, s.x2, s.y);
}
}
memset(T, 0, sizeof T); V.clear();
for(int i=1;i<=N;i++) {
V.pb(seg(P[i].x1+1, P[i].x2-1, -P[i].y1, 1));
V.pb(seg(P[i].x1, 4*i+cmd, -P[i].y2, -1));
V.pb(seg(P[i].x2, 4*i+1+cmd, -P[i].y2, -1));
}
sort(all(V));
for(auto &s : V) {
if(s.c < 0) {
int v = -read_t(s.x1);
if(v == 0) v = LX;
LR[s.x2].Se = v;
}
else {
update_t(s.x1, s.x2, s.y);
}
}
memset(T, 0, sizeof T); V.clear();
}
int dis[400040];
set <pii> Sx[2][1<<19]; const int ADD = 1<<18;
void update(int a, int x, int y1, int y2, int val) {
y1 += ADD; y2 += ADD;
while(y1 <= y2) {
if(y1 & 1) Sx[a][y1++].insert(pii(x, val));
if(!(y2 & 1)) Sx[a][y2--].insert(pii(x, val));
y1 >>= 1, y2 >>= 1;
}
}
int read(int a, int x1, int x2, int y) {
y += ADD;
while(y) {
auto it = Sx[a][y].lower_bound(pii(x1, -1));
while(1) {
if(it == Sx[a][y].end() || it->Fi > x2) break;
if(dis[it->Se] == -1) return it->Se;
auto jt = it++;
Sx[a][y].erase(jt);
}
y >>= 1;
}
return -1;
}
int pp[400040]; int Find(int x) { return pp[x] == x ? x : pp[x] = Find(pp[x]); }
int main() {
int ss, tt, uu, vv; scanf("%d%d%d%d", &ss, &tt, &uu, &vv);
scanf("%d", &N);
P[1] = rect(ss, ss, tt, tt);
P[2] = rect(uu, uu, vv, vv);
for(int i=3;i<=N+2;i++) {
int x1, x2, y1, y2;
scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
P[i] = rect(x1, x2, y1, y2);
}
N += 2;
for(int i=1;i<=N;i++) {
vx.pb(P[i].x1); vx.pb(P[i].x2);
vy.pb(P[i].y1); vy.pb(P[i].y2);
}
sort(all(vx)); vx.resize(unique(all(vx)) - vx.begin());
sort(all(vy)); vy.resize(unique(all(vy)) - vy.begin());
for(int i=1;i<=N;i++) {
P[i].x1 = (int)(lower_bound(all(vx), P[i].x1) - vx.begin() + 1);
P[i].x2 = (int)(lower_bound(all(vx), P[i].x2) - vx.begin() + 1);
P[i].y1 = (int)(lower_bound(all(vy), P[i].y1) - vy.begin() + 1);
P[i].y2 = (int)(lower_bound(all(vy), P[i].y2) - vy.begin() + 1);
}
LX = max(szz(vx), szz(vy)) + 1;
get_line(0);
flip_xy();
get_line(2);
flip_xy();
map <t3, int> Mx[2];
rep(i, 4*N+5) pp[i] = i;
for(int i=1;i<=N;i++) {
rep(a, 4) {
pii p = LR[4*i+a];
t3 t;
if(a == 0) t = t3(P[i].x1, p.Fi, p.Se);
else if(a == 1) t = t3(P[i].x2, p.Fi, p.Se);
else if(a == 2) t = t3(P[i].y1, p.Fi, p.Se);
else t = t3(P[i].y2, p.Fi, p.Se);
int ta = !!(a & 2);
if(Mx[ta].find(t) == Mx[ta].end()) Mx[ta][t] = 4*i+a;
else pp[Find(4*i+a)] = Find(Mx[ta][t]);
}
}
for(int i=4;i<4*N+4;i++) if(pp[i] == i) {
if(i&2) {
int x = (i%4==2 ? P[i/4].y1 : P[i/4].y2);
update(1, x, LR[i].Fi, LR[i].Se, i);
}
else {
int x = (i%4==0 ? P[i/4].x1 : P[i/4].x2);
update(0, x, LR[i].Fi, LR[i].Se, i);
}
}
memset(dis, -1, sizeof dis);
vector <int> q;
for(int i=4;i<=7;i++) {
int pi = Find(i);
if(dis[pi] == -1) {
dis[pi] = 1; q.pb(pi);
}
}
rep(i, szz(q)) {
int t = q[i];
while(1) {
int v = -1;
if(t&2) {
int x = (t%4==2 ? P[t/4].y1 : P[t/4].y2);
v = read(0, LR[t].Fi, LR[t].Se, x);
}
else {
int x = (t%4==0 ? P[t/4].x1 : P[t/4].x2);
v = read(1, LR[t].Fi, LR[t].Se, x);
}
if(v == -1) break;
q.pb(v); dis[v] = dis[t] + 1;
}
}
int ans = 1e9;
for(int i=8;i<12;i++) {
int pi = Find(i);
if(dis[pi] != -1) ans = min(ans, dis[pi]);
}
printf("%d\n", ans);
return 0;
}
Compilation message
golf.cpp: In constructor 'rect::rect(int, int, int, int)':
golf.cpp:35:14: warning: 'rect::y1' will be initialized after [-Wreorder]
int x1, x2, y1, y2;
^~
golf.cpp:35:10: warning: 'int rect::x2' [-Wreorder]
int x1, x2, y1, y2;
^~
golf.cpp:34:2: warning: when initialized here [-Wreorder]
rect(int x1, int x2, int y1, int y2):x1(x1), y1(y1), x2(x2), y2(y2){}
^~~~
golf.cpp: In function 'int main()':
golf.cpp:151:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
int ss, tt, uu, vv; scanf("%d%d%d%d", &ss, &tt, &uu, &vv);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
golf.cpp:152:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &N);
~~~~~^~~~~~~~~~
golf.cpp:157:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
42 ms |
53248 KB |
Output is correct |
2 |
Correct |
37 ms |
53248 KB |
Output is correct |
3 |
Correct |
37 ms |
53248 KB |
Output is correct |
4 |
Correct |
38 ms |
53376 KB |
Output is correct |
5 |
Correct |
53 ms |
54496 KB |
Output is correct |
6 |
Correct |
49 ms |
54440 KB |
Output is correct |
7 |
Correct |
46 ms |
54264 KB |
Output is correct |
8 |
Correct |
46 ms |
54284 KB |
Output is correct |
9 |
Correct |
55 ms |
54392 KB |
Output is correct |
10 |
Correct |
54 ms |
54392 KB |
Output is correct |
11 |
Correct |
55 ms |
54392 KB |
Output is correct |
12 |
Correct |
58 ms |
54392 KB |
Output is correct |
13 |
Correct |
51 ms |
54264 KB |
Output is correct |
14 |
Correct |
50 ms |
54392 KB |
Output is correct |
15 |
Correct |
45 ms |
53624 KB |
Output is correct |
16 |
Correct |
45 ms |
54016 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
42 ms |
53248 KB |
Output is correct |
2 |
Correct |
37 ms |
53248 KB |
Output is correct |
3 |
Correct |
37 ms |
53248 KB |
Output is correct |
4 |
Correct |
38 ms |
53376 KB |
Output is correct |
5 |
Correct |
53 ms |
54496 KB |
Output is correct |
6 |
Correct |
49 ms |
54440 KB |
Output is correct |
7 |
Correct |
46 ms |
54264 KB |
Output is correct |
8 |
Correct |
46 ms |
54284 KB |
Output is correct |
9 |
Correct |
55 ms |
54392 KB |
Output is correct |
10 |
Correct |
54 ms |
54392 KB |
Output is correct |
11 |
Correct |
55 ms |
54392 KB |
Output is correct |
12 |
Correct |
58 ms |
54392 KB |
Output is correct |
13 |
Correct |
51 ms |
54264 KB |
Output is correct |
14 |
Correct |
50 ms |
54392 KB |
Output is correct |
15 |
Correct |
45 ms |
53624 KB |
Output is correct |
16 |
Correct |
45 ms |
54016 KB |
Output is correct |
17 |
Correct |
56 ms |
54840 KB |
Output is correct |
18 |
Correct |
66 ms |
54884 KB |
Output is correct |
19 |
Correct |
55 ms |
54776 KB |
Output is correct |
20 |
Correct |
55 ms |
54780 KB |
Output is correct |
21 |
Correct |
50 ms |
54904 KB |
Output is correct |
22 |
Correct |
57 ms |
54824 KB |
Output is correct |
23 |
Correct |
63 ms |
54812 KB |
Output is correct |
24 |
Correct |
59 ms |
54852 KB |
Output is correct |
25 |
Correct |
55 ms |
54820 KB |
Output is correct |
26 |
Correct |
55 ms |
54784 KB |
Output is correct |
27 |
Correct |
41 ms |
53624 KB |
Output is correct |
28 |
Correct |
59 ms |
54136 KB |
Output is correct |
29 |
Correct |
43 ms |
54144 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
42 ms |
53248 KB |
Output is correct |
2 |
Correct |
37 ms |
53248 KB |
Output is correct |
3 |
Correct |
37 ms |
53248 KB |
Output is correct |
4 |
Correct |
38 ms |
53376 KB |
Output is correct |
5 |
Correct |
53 ms |
54496 KB |
Output is correct |
6 |
Correct |
49 ms |
54440 KB |
Output is correct |
7 |
Correct |
46 ms |
54264 KB |
Output is correct |
8 |
Correct |
46 ms |
54284 KB |
Output is correct |
9 |
Correct |
55 ms |
54392 KB |
Output is correct |
10 |
Correct |
54 ms |
54392 KB |
Output is correct |
11 |
Correct |
55 ms |
54392 KB |
Output is correct |
12 |
Correct |
58 ms |
54392 KB |
Output is correct |
13 |
Correct |
51 ms |
54264 KB |
Output is correct |
14 |
Correct |
50 ms |
54392 KB |
Output is correct |
15 |
Correct |
45 ms |
53624 KB |
Output is correct |
16 |
Correct |
45 ms |
54016 KB |
Output is correct |
17 |
Correct |
56 ms |
54840 KB |
Output is correct |
18 |
Correct |
66 ms |
54884 KB |
Output is correct |
19 |
Correct |
55 ms |
54776 KB |
Output is correct |
20 |
Correct |
55 ms |
54780 KB |
Output is correct |
21 |
Correct |
50 ms |
54904 KB |
Output is correct |
22 |
Correct |
57 ms |
54824 KB |
Output is correct |
23 |
Correct |
63 ms |
54812 KB |
Output is correct |
24 |
Correct |
59 ms |
54852 KB |
Output is correct |
25 |
Correct |
55 ms |
54820 KB |
Output is correct |
26 |
Correct |
55 ms |
54784 KB |
Output is correct |
27 |
Correct |
41 ms |
53624 KB |
Output is correct |
28 |
Correct |
59 ms |
54136 KB |
Output is correct |
29 |
Correct |
43 ms |
54144 KB |
Output is correct |
30 |
Correct |
3750 ms |
278696 KB |
Output is correct |
31 |
Correct |
3697 ms |
278904 KB |
Output is correct |
32 |
Correct |
3851 ms |
280408 KB |
Output is correct |
33 |
Correct |
4226 ms |
280732 KB |
Output is correct |
34 |
Correct |
3961 ms |
284048 KB |
Output is correct |
35 |
Correct |
4139 ms |
283708 KB |
Output is correct |
36 |
Correct |
3844 ms |
283276 KB |
Output is correct |
37 |
Correct |
3879 ms |
282512 KB |
Output is correct |
38 |
Correct |
3948 ms |
283944 KB |
Output is correct |
39 |
Correct |
4035 ms |
281828 KB |
Output is correct |
40 |
Correct |
3039 ms |
314596 KB |
Output is correct |
41 |
Correct |
3150 ms |
296192 KB |
Output is correct |
42 |
Correct |
2371 ms |
242840 KB |
Output is correct |
43 |
Correct |
2421 ms |
242844 KB |
Output is correct |
44 |
Correct |
2667 ms |
263604 KB |
Output is correct |
45 |
Correct |
2757 ms |
263588 KB |
Output is correct |
46 |
Correct |
2753 ms |
263552 KB |
Output is correct |
47 |
Correct |
2855 ms |
282308 KB |
Output is correct |
48 |
Correct |
2564 ms |
244720 KB |
Output is correct |
49 |
Correct |
2843 ms |
263536 KB |
Output is correct |
50 |
Correct |
44 ms |
54144 KB |
Output is correct |
51 |
Correct |
51 ms |
54192 KB |
Output is correct |
52 |
Correct |
45 ms |
54112 KB |
Output is correct |