Submission #1302337

#TimeUsernameProblemLanguageResultExecution timeMemory
1302337floTowers (NOI22_towers)C++20
11 / 100
656 ms116240 KiB
#include <bits/stdc++.h>
#define task "testing"
#define ll long long
#define multitest 0
using namespace std;

struct Point {
	int x, y;
};

const int N = 1e6;

Point p[N+5];

bool ans[N+5];

int cntx[N+5], cnty[N+5];

vector<int> dx, dy, X[N+5], Y[N+5];

bool cmpx(int x, int y) {
	return p[x].x < p[y].x;
}

bool cmpy(int x, int y) {
	return p[x].y < p[y].y;
}

void on(int i) {
	if (ans[i]) return;
	
	cntx[p[i].x]++;
	cnty[p[i].y]++;
	
	ans[i] = 1;
}

void off(int i) {
	if (!ans[i]) return;
	
	cntx[p[i].x]--;
	cnty[p[i].y]--;
	
	ans[i] = 0;
}

void flo(int ID) {
	int n; cin >> n;
	
	for (int i = 1; i <= n; i++) {
		cin >> p[i].x >> p[i].y;
		
		dx.push_back(p[i].x);
		dy.push_back(p[i].y);
		
		X[p[i].x].push_back(i);
		Y[p[i].y].push_back(i);
	}
	
	sort(dx.begin(), dx.end());
	sort(dy.begin(), dy.end());
	
	dx.resize(unique(dx.begin(), dx.end())-dx.begin());
	dy.resize(unique(dy.begin(), dy.end())-dy.begin());
	
	for (auto x : dx) {
		sort(X[x].begin(), X[x].end(), cmpy);
		
		on(X[x][0]), on(X[x].back());
	}
	
	for (auto y : dy) {
		sort(Y[y].begin(), Y[y].end(), cmpx);
		
		on(Y[y][0]), on(Y[y].back());
	}
	
	for (auto x : dx) {
		for (int i = 0; i < X[x].size(); i++) {
			if (cnty[p[X[x][i]].y] <= 2) break;
			
			if (X[x][i] == Y[p[X[x][i]].y][0] || X[x][i] == Y[p[X[x][i]].y].back()) continue;
			
			off(X[x][i]);
			
			if (i+1 < X[x].size()) {
				on(X[x][i+1]);
			}
		}
		
		for (int i = X[x].size()-1; i >= 0; i--) {
			if (cnty[p[X[x][i]].y] <= 2) break;
			
			if (X[x][i] == Y[p[X[x][i]].y][0] || X[x][i] == Y[p[X[x][i]].y].back()) continue;
			
			off(X[x][i]);
			
			if (i > 0) {
				on(X[x][i-1]);
			}
		}
	}
	
	for (auto y : dy) {
		for (int i = 0; i < Y[y].size(); i++) {
			if (cntx[p[Y[y][i]].x] <= 2) break;
			
			if (Y[y][i] == X[p[Y[y][i]].x][0] || Y[y][i] == X[p[Y[y][i]].x].back()) continue;
			
			off(Y[y][i]);
			
			if (i+1 < Y[y].size()) {
				on(Y[y][i+1]);
			}
		}
		
		for (int i = Y[y].size()-1; i >= 0; i--) {
			if (cntx[p[Y[y][i]].x] <= 2) break;
			
			if (Y[y][i] == X[p[Y[y][i]].x][0] || Y[y][i] == X[p[Y[y][i]].x].back()) continue;
			
			off(Y[y][i]);
			
			if (i > 0) {
				on(Y[y][i-1]);
			}
		}
	}
	
	for (int i = 1; i <= n; i++) cout << ans[i];
	
	cout << "\n";
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	if (fopen(task".inp", "r")) {
		freopen(task".inp", "r", stdin);
		freopen(task".out", "w", stdout);
	}

	int TCS = 1, ID = 1;

	if (multitest) {
		cin >> TCS;
	}

	while (TCS--) flo(ID++);

	return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:140:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  140 |                 freopen(task".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:141:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  141 |                 freopen(task".out", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...