제출 #334385

#제출 시각아이디문제언어결과실행 시간메모리
334385Seanliu원 고르기 (APIO18_circle_selection)C++17
100 / 100
1432 ms49664 KiB
#pragma GCC target ("avx2")
#pragma GCC optimization ("Ofast")
#pragma GCC optimization ("unroll-loops")
#include <unordered_map>
#include <numeric>
#include <algorithm>
#include <vector>
#define int long long int
#define ericxiao ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;

const int maxN = 3e5 + 326, maxC = 1e9 + 326;
int ans[maxN], x[maxN], y[maxN], r[maxN], N, ord[maxN], curSz;

unordered_map<int, vector<int> > mp;

inline char readchar(){
	const int S = 1<<16;
	static char buf[S], *p = buf, *q = buf;
	return p == q and (q = (p = buf) + fread(buf, 1, S, stdin)) == buf ? EOF : *p++;
}

inline void Read(int &a){
	static char c;
	while(((c = readchar()) < '0' or c > '9') and c != '-' and c != EOF);
	if(c == '-'){
		a = 0;
		while((c = readchar()) >= '0' and c <= '9') a *= 10, a -= c ^ '0';
	} else {
		a = c ^ '0';
		while((c = readchar()) >= '0' and c <= '9') a *= 10, a += c ^ '0';
	}
}

char outbuf[1 << 16]; int outp;
inline void W(int n){
	static char buf[12], p;
	if(n == 0) outbuf[outp++] = '0';
	p = 0;
	if(n < 0){
		outbuf[outp++] = '-';
		while(n) buf[p++] = '0' - (n % 10), n /= 10;
	} else {
		while(n) buf[p++] = '0' + (n % 10), n /= 10;
	}
	for(--p; p >= 0; --p) outbuf[outp++] = buf[p];
	outbuf[outp++] = ' ';
	if(outp > (1 << 16)-12) fwrite(outbuf, 1, outp, stdout), outp = 0;
}

inline void assign(){
	mp = unordered_map<int, vector<int> >();
	for(int i = 1; i <= N; i++){
		if(ans[i]) continue;
		int k = maxC * (x[i] / curSz) + (y[i] / curSz);
		if(!mp.count(k)) mp[k] = vector<int>();
		mp[k].push_back(i);
	}
}

inline bool intersect(int i, int j){
	return (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) <= r[i] * r[i] + 2 * r[i] * r[j] + r[j] * r[j];
}

inline void kill(int sel){
	int X = x[sel] / curSz, Y = y[sel] / curSz;
	for(int i = (X - 2) * maxC; i <= (X + 2) * maxC; i += maxC){
		for(int j = Y - 2; j <= Y + 2; j++){
			if(!mp.count(i + j)) continue;
			for(int ind : mp[i + j]){
				if(ans[ind]) continue;
				if(intersect(ind, sel)){
					ans[ind] = sel;
				}
			}
		}
	}
}

signed main(){
	Read(N);
	mp.reserve(N);
	for(int i = 1; i <= N; i++){
		Read(x[i]);
		Read(y[i]);
		Read(r[i]);
	}
	iota(ord, ord + N + 1, 0);
	sort(ord + 1, ord + N + 1, [](int a, int b){
		return (r[a] == r[b] ? a < b : r[a] > r[b]);
	});
	curSz = 1LL << 32;
	for(int i = 1; i <= N; i++){
		if(ans[ord[i]]) continue;
		bool f = true;
		while(curSz >= 2 * r[ord[i]]){
			curSz /= 2;	
			f = false;
		}
		if(!f) assign();
		kill(ord[i]);
	}
	for(int i = 1; i <= N; i++) W(ans[i]);
	fwrite(outbuf, 1, outp, stdout);
	puts("");
}

컴파일 시 표준 에러 (stderr) 메시지

circle_selection.cpp:2: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
    2 | #pragma GCC optimization ("Ofast")
      | 
circle_selection.cpp:3: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
    3 | #pragma GCC optimization ("unroll-loops")
      | 
circle_selection.cpp: In function 'void W(long long int)':
circle_selection.cpp:42:17: warning: array subscript has type 'char' [-Wchar-subscripts]
   42 |   while(n) buf[p++] = '0' - (n % 10), n /= 10;
      |                ~^~
circle_selection.cpp:44:17: warning: array subscript has type 'char' [-Wchar-subscripts]
   44 |   while(n) buf[p++] = '0' + (n % 10), n /= 10;
      |                ~^~
circle_selection.cpp:46:45: warning: array subscript has type 'char' [-Wchar-subscripts]
   46 |  for(--p; p >= 0; --p) outbuf[outp++] = buf[p];
      |                                             ^
#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...