답안 #258844

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
258844 2020-08-06T15:43:44 Z amoo_safar 함박 스테이크 (JOI20_hamburg) C++17
15 / 100
567 ms 76856 KB
// Zende bad Shoma nasime faghat !
#include <bits/stdc++.h>

#define pb push_back
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " : " << x << '\n'

using namespace std;

typedef long long ll;
typedef long double ld;
typedef string str;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;

const ll Mod = 1000000007LL;
const int N = 2e5 + 10;
const ll Inf = 2242545357980376863LL;
const ll Log = 30;

int n, k;
int L[N], R[N], U[N], D[N];

vector<int> uX, uY;
vector<pii> points;

void Done(){
	while((int) points.size() < k) points.pb(pii(0, 0));
	for(auto x : points) printf("%d %d\n", uX[x.F], uY[x.S]);
	exit(0);
}

int mk[N];
bool In(pii P, int id){
	return L[id] <= P.F && P.F <= R[id] && D[id] <= P.S && P.S <= U[id];
}
void On(pii P, int col){
	for(int i = 0; i < n; i++){
		if(L[i] <= P.F && P.F <= R[i] && D[i] <= P.S && P.S <= U[i] && !mk[i]) mk[i] = col;
	}
	points.pb(P);
}
void Off(int col){
	for(int i = 0; i < n; i++)
		if(mk[i] == col)
			mk[i] = 0;
	points.pop_back();
}

void Solve(int y){
	if(y == 0){
		for(int i = 0; i < n; i++)
			if(!mk[i])
				return ;
	}
	int mnx = N, mxx = -1;
	for(int i = 0; i < n; i++)
		if(!mk[i])
			mnx = min(mnx, R[i]), mxx = max(mxx, L[i]);
	if(mxx == -1){
		for(int i = 0; i < y; i++) points.pb(pii(0, 0));
		Done();
	}


	int mny = N, mxy = -1;
	for(int i = 0; i < n; i++)
		if(!mk[i])
			mny = min(mny, U[i]), mxy = max(mxy, D[i]);
	
	for(int px : {mnx, mxx}){
		for(int py : {mny, mxy}){
			On({px, py}, y);
			Solve(y - 1);
			Off(y);
		}
	}
}

const int N2 = N * 4;
vector<int> O[N2], I[N2];
void AddE(int u, int v){
	O[u].pb(v);
	I[v].pb(u);
}
void AddC(int u, int v){
	//if(u == v);
	AddE(u ^ 1, v);
	AddE(v ^ 1, u);
}
void Ban(int u, int v){
	AddC(u ^ 1, v ^ 1);
}

int mark[N2];
vector<int> top;
void DFS(int u){
	mark[u] = 1;
	for(auto adj : O[u]) if(!mark[adj]) DFS(adj);
	top.pb(u);
}

void DFS(int u, int c){
	mark[u] = c;
	for(auto adj : I[u]) if(!mark[adj]) DFS(adj, c);
}

bool isst[N];

void Main(){

	int mnx = N, mxx = -1;
	for(int i = 0; i < n; i++)
		if(!mk[i])
			mnx = min(mnx, R[i]), mxx = max(mxx, L[i]);
	int mny = N, mxy = -1;
	for(int i = 0; i < n; i++)
		if(!mk[i])
			mny = min(mny, U[i]), mxy = max(mxy, D[i]);
	
	vector<pii> po;
	vector<int> ln;
	{ // Nodes
		int st = 0;
		for(int i = mxx + 1; i < mnx; i++)
			po.pb({i, mny});	
		
		isst[st] = true;
		for(int i = st; i + 1 < (int) po.size(); i++)
			Ban(i << 1 | 1, (i + 1) << 1);
		st = po.size();
		/////////////////////
		for(int i = mxx + 1; i < mnx; i++)
			po.pb({i, mxy});

		isst[st] = true;
		for(int i = st; i + 1 < (int) po.size(); i++)
			Ban(i << 1 | 1, (i + 1) << 1);
		st = po.size();
		/////////////////////
		for(int i = mxy + 1; i < mny; i++)
			po.pb({mnx, i});	
		
		isst[st] = true;
		for(int i = st; i + 1 < (int) po.size(); i++)
			Ban(i << 1 | 1, (i + 1) << 1);
		st = po.size();
		/////////////////////
		for(int i = mxy + 1; i < mny; i++)
			po.pb({mxx, i});

		isst[st] = true;
		for(int i = st; i + 1 < (int) po.size(); i++)
			Ban(i << 1 | 1, (i + 1) << 1);
		st = po.size();
	}
	int m = po.size();
	for(int i = 0; i < m; i++) if(isst[i]) ln.pb(i);
	ln.pb(m);
	assert(ln.size() == 5);

	int fst, la;
	vector<pii> seg;
	for(int i = 0; i < n; i++){
		seg.clear();
		for(int j = 0; j < 4; j++){
			fst = -1; la = -1;
			for(int l = ln[j]; l < ln[j + 1]; l++){
				if(In(po[l], i)){
					la = l;
					if(fst == -1) fst = l;
				}
			}

			if(fst == -1) continue;
			seg.pb({fst, la});
		}

		if(seg.empty() || seg.size() > 2) continue;
		if(seg.size() == 1){
			AddC(seg[0].S << 1 | 1, seg[0].S << 1 | 1);
			if(!isst[seg[0].F])
				AddC((seg[0].F - 1) << 1, (seg[0].F - 1) << 1);
		} else {
			vector<int> B[2];
			for(int j = 0; j < 2; j++){
				B[j].pb(seg[j].S << 1 | 0);
				if(!isst[seg[j].F])
					B[j].pb((seg[j].F - 1) << 1 | 1);
			}
			for(int b1 : B[0]) for(int b2 : B[1]) Ban(b1, b2);
		}
	}

	for(int i = 0; i < m + m; i++){
		if(!mk[i]) DFS(i);
	}
	reverse(all(top));
	memset(mark, 0, sizeof mark);
	int cnt = 1;
	for(auto x : top) if(!mark[x]){
		DFS(x, cnt);
		cnt ++;
	}
	vector<int> val(m, 0);
	for(int i = 0; i < m; i++)
		val[i] = (mark[i + i] < mark[i + i + 1] ? 1 : 0);

	for(int j = 0; j < 4; j++){
		for(int l = ln[j]; l < ln[j + 1]; l++){
			if(val[l]){
				points.pb(po[l]);
				break;
			}
		}
	}
	Done();
}

int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	scanf("%d%d", &n, &k);
	for(int i = 0; i < n; i++) scanf("%d%d%d%d", L + i, D + i, R + i, U + i);

	for(int i = 0; i < n; i++) uX.pb(L[i]), uY.pb(D[i]), uX.pb(R[i]), uY.pb(U[i]);
	
	sort(all(uX)); uX.resize(unique(all(uX)) - uX.begin());
	sort(all(uY)); uY.resize(unique(all(uY)) - uY.begin());

	for(int i = 0; i < n; i++){
		L[i] = lower_bound(all(uX), L[i]) - uX.begin();
		R[i] = lower_bound(all(uX), R[i]) - uX.begin();
		U[i] = lower_bound(all(uY), U[i]) - uY.begin();
		D[i] = lower_bound(all(uY), D[i]) - uY.begin();
	}

	//assert(k <= 3);

	Solve(k);
	assert(k == 4);
	Main();

	return 0;
}

/*
4 4
1 4 1 4
2 1 2 1
3 0 3 0
4 3 4 3

*/

Compilation message

hamburg.cpp: In function 'int main()':
hamburg.cpp:224:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  224 |  scanf("%d%d", &n, &k);
      |  ~~~~~^~~~~~~~~~~~~~~~
hamburg.cpp:225:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  225 |  for(int i = 0; i < n; i++) scanf("%d%d%d%d", L + i, D + i, R + i, U + i);
      |                             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 38076 KB Output is correct
2 Correct 29 ms 38136 KB Output is correct
3 Correct 30 ms 38024 KB Output is correct
4 Correct 32 ms 38084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 38096 KB Output is correct
2 Correct 30 ms 38016 KB Output is correct
3 Correct 30 ms 38016 KB Output is correct
4 Correct 32 ms 38016 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 38016 KB Output is correct
2 Correct 30 ms 38092 KB Output is correct
3 Correct 31 ms 38016 KB Output is correct
4 Correct 32 ms 38092 KB Output is correct
5 Correct 33 ms 38016 KB Output is correct
6 Correct 30 ms 38016 KB Output is correct
7 Correct 31 ms 38016 KB Output is correct
8 Correct 32 ms 38008 KB Output is correct
9 Correct 32 ms 38016 KB Output is correct
10 Correct 30 ms 38016 KB Output is correct
11 Correct 30 ms 38016 KB Output is correct
12 Correct 32 ms 38016 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 38008 KB Output is correct
2 Correct 31 ms 38020 KB Output is correct
3 Correct 29 ms 38016 KB Output is correct
4 Correct 30 ms 38008 KB Output is correct
5 Correct 32 ms 38016 KB Output is correct
6 Correct 30 ms 38016 KB Output is correct
7 Correct 31 ms 38016 KB Output is correct
8 Correct 29 ms 38008 KB Output is correct
9 Correct 33 ms 38016 KB Output is correct
10 Correct 35 ms 38140 KB Output is correct
11 Correct 30 ms 38016 KB Output is correct
12 Correct 31 ms 38016 KB Output is correct
13 Correct 40 ms 38016 KB Output is correct
14 Runtime error 93 ms 76856 KB Execution killed with signal 11 (could be triggered by violating memory limits)
15 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 38076 KB Output is correct
2 Correct 29 ms 38136 KB Output is correct
3 Correct 30 ms 38024 KB Output is correct
4 Correct 32 ms 38084 KB Output is correct
5 Correct 405 ms 45244 KB Output is correct
6 Correct 404 ms 45236 KB Output is correct
7 Correct 461 ms 45232 KB Output is correct
8 Correct 428 ms 45232 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 38096 KB Output is correct
2 Correct 30 ms 38016 KB Output is correct
3 Correct 30 ms 38016 KB Output is correct
4 Correct 32 ms 38016 KB Output is correct
5 Correct 399 ms 45252 KB Output is correct
6 Correct 421 ms 45216 KB Output is correct
7 Correct 406 ms 45136 KB Output is correct
8 Correct 413 ms 45240 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 38016 KB Output is correct
2 Correct 30 ms 38092 KB Output is correct
3 Correct 31 ms 38016 KB Output is correct
4 Correct 32 ms 38092 KB Output is correct
5 Correct 33 ms 38016 KB Output is correct
6 Correct 30 ms 38016 KB Output is correct
7 Correct 31 ms 38016 KB Output is correct
8 Correct 32 ms 38008 KB Output is correct
9 Correct 32 ms 38016 KB Output is correct
10 Correct 30 ms 38016 KB Output is correct
11 Correct 30 ms 38016 KB Output is correct
12 Correct 32 ms 38016 KB Output is correct
13 Correct 470 ms 45232 KB Output is correct
14 Correct 422 ms 45184 KB Output is correct
15 Correct 417 ms 45228 KB Output is correct
16 Correct 415 ms 45244 KB Output is correct
17 Correct 387 ms 45272 KB Output is correct
18 Correct 387 ms 45176 KB Output is correct
19 Correct 402 ms 45140 KB Output is correct
20 Correct 410 ms 45136 KB Output is correct
21 Correct 567 ms 45236 KB Output is correct
22 Correct 527 ms 45136 KB Output is correct
23 Correct 509 ms 45272 KB Output is correct
24 Correct 479 ms 45136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 38008 KB Output is correct
2 Correct 31 ms 38020 KB Output is correct
3 Correct 29 ms 38016 KB Output is correct
4 Correct 30 ms 38008 KB Output is correct
5 Correct 32 ms 38016 KB Output is correct
6 Correct 30 ms 38016 KB Output is correct
7 Correct 31 ms 38016 KB Output is correct
8 Correct 29 ms 38008 KB Output is correct
9 Correct 33 ms 38016 KB Output is correct
10 Correct 35 ms 38140 KB Output is correct
11 Correct 30 ms 38016 KB Output is correct
12 Correct 31 ms 38016 KB Output is correct
13 Correct 40 ms 38016 KB Output is correct
14 Runtime error 93 ms 76856 KB Execution killed with signal 11 (could be triggered by violating memory limits)
15 Halted 0 ms 0 KB -