답안 #100974

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
100974 2019-03-15T15:24:20 Z cki86201 Golf (JOI17_golf) C++11
100 / 100
3952 ms 312696 KB
#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);
		}
	}
	for(int i=8;i<12;i++) if(dis[Find(i)] == 1) {
		puts("1");
		return 0;
	}
	
	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;
			
			for(int i=8;i<12;i++) if(Find(i) == v) {
				printf("%d\n", dis[v]);
				return 0;
			}
		}
	}
	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 38 ms 53248 KB Output is correct
2 Correct 48 ms 53248 KB Output is correct
3 Correct 39 ms 53240 KB Output is correct
4 Correct 39 ms 53376 KB Output is correct
5 Correct 45 ms 54476 KB Output is correct
6 Correct 56 ms 54520 KB Output is correct
7 Correct 46 ms 54264 KB Output is correct
8 Correct 54 ms 54392 KB Output is correct
9 Correct 48 ms 54368 KB Output is correct
10 Correct 54 ms 54376 KB Output is correct
11 Correct 48 ms 54368 KB Output is correct
12 Correct 45 ms 54392 KB Output is correct
13 Correct 47 ms 54368 KB Output is correct
14 Correct 53 ms 54400 KB Output is correct
15 Correct 44 ms 53624 KB Output is correct
16 Correct 60 ms 54032 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 53248 KB Output is correct
2 Correct 48 ms 53248 KB Output is correct
3 Correct 39 ms 53240 KB Output is correct
4 Correct 39 ms 53376 KB Output is correct
5 Correct 45 ms 54476 KB Output is correct
6 Correct 56 ms 54520 KB Output is correct
7 Correct 46 ms 54264 KB Output is correct
8 Correct 54 ms 54392 KB Output is correct
9 Correct 48 ms 54368 KB Output is correct
10 Correct 54 ms 54376 KB Output is correct
11 Correct 48 ms 54368 KB Output is correct
12 Correct 45 ms 54392 KB Output is correct
13 Correct 47 ms 54368 KB Output is correct
14 Correct 53 ms 54400 KB Output is correct
15 Correct 44 ms 53624 KB Output is correct
16 Correct 60 ms 54032 KB Output is correct
17 Correct 50 ms 54784 KB Output is correct
18 Correct 58 ms 54880 KB Output is correct
19 Correct 55 ms 54736 KB Output is correct
20 Correct 51 ms 54784 KB Output is correct
21 Correct 51 ms 54904 KB Output is correct
22 Correct 64 ms 54872 KB Output is correct
23 Correct 51 ms 54776 KB Output is correct
24 Correct 49 ms 54904 KB Output is correct
25 Correct 49 ms 54752 KB Output is correct
26 Correct 52 ms 54776 KB Output is correct
27 Correct 44 ms 53624 KB Output is correct
28 Correct 43 ms 54144 KB Output is correct
29 Correct 43 ms 54136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 53248 KB Output is correct
2 Correct 48 ms 53248 KB Output is correct
3 Correct 39 ms 53240 KB Output is correct
4 Correct 39 ms 53376 KB Output is correct
5 Correct 45 ms 54476 KB Output is correct
6 Correct 56 ms 54520 KB Output is correct
7 Correct 46 ms 54264 KB Output is correct
8 Correct 54 ms 54392 KB Output is correct
9 Correct 48 ms 54368 KB Output is correct
10 Correct 54 ms 54376 KB Output is correct
11 Correct 48 ms 54368 KB Output is correct
12 Correct 45 ms 54392 KB Output is correct
13 Correct 47 ms 54368 KB Output is correct
14 Correct 53 ms 54400 KB Output is correct
15 Correct 44 ms 53624 KB Output is correct
16 Correct 60 ms 54032 KB Output is correct
17 Correct 50 ms 54784 KB Output is correct
18 Correct 58 ms 54880 KB Output is correct
19 Correct 55 ms 54736 KB Output is correct
20 Correct 51 ms 54784 KB Output is correct
21 Correct 51 ms 54904 KB Output is correct
22 Correct 64 ms 54872 KB Output is correct
23 Correct 51 ms 54776 KB Output is correct
24 Correct 49 ms 54904 KB Output is correct
25 Correct 49 ms 54752 KB Output is correct
26 Correct 52 ms 54776 KB Output is correct
27 Correct 44 ms 53624 KB Output is correct
28 Correct 43 ms 54144 KB Output is correct
29 Correct 43 ms 54136 KB Output is correct
30 Correct 2996 ms 275436 KB Output is correct
31 Correct 3035 ms 276140 KB Output is correct
32 Correct 3557 ms 280160 KB Output is correct
33 Correct 3838 ms 280564 KB Output is correct
34 Correct 3345 ms 281388 KB Output is correct
35 Correct 3952 ms 283464 KB Output is correct
36 Correct 2809 ms 279728 KB Output is correct
37 Correct 3816 ms 280860 KB Output is correct
38 Correct 3147 ms 281104 KB Output is correct
39 Correct 3729 ms 281184 KB Output is correct
40 Correct 2628 ms 312696 KB Output is correct
41 Correct 2453 ms 293560 KB Output is correct
42 Correct 1930 ms 239780 KB Output is correct
43 Correct 1954 ms 240980 KB Output is correct
44 Correct 2340 ms 260216 KB Output is correct
45 Correct 2310 ms 261384 KB Output is correct
46 Correct 2289 ms 261540 KB Output is correct
47 Correct 2450 ms 279448 KB Output is correct
48 Correct 2076 ms 241588 KB Output is correct
49 Correct 2411 ms 261656 KB Output is correct
50 Correct 47 ms 54136 KB Output is correct
51 Correct 44 ms 54136 KB Output is correct
52 Correct 44 ms 54136 KB Output is correct