답안 #100973

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
100973 2019-03-15T15:21:07 Z cki86201 Golf (JOI17_golf) C++11
100 / 100
4226 ms 314596 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);
		}
	}
	
	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