답안 #252485

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
252485 2020-07-25T17:02:06 Z shayan_p 원 고르기 (APIO18_circle_selection) C++14
87 / 100
3000 ms 210708 KB
// And you curse yourself for things you never done

#include<bits/stdc++.h>

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

const int maxn = 3e5 + 10, mod = 1e9 + 7, inf = 1e9 + 10;
const ll INF = 1e18;

pair<pii, int> p[maxn];
int arr[maxn], ans[maxn];

pii operator - (pii a, pii b){
    return {a.F - b.F, a.S - b.S};
}
pii operator + (pii a, pii b){
    return {a.F + b.F, a.S + b.S};
}
ll operator ^ (pii a, pii b){
    return 1ll * a.F * b.F + 1ll * a.S * b.S;
}
bool ok(int i, int j){
    return 1ll * (p[j].S + p[i].S) * (p[j].S + p[i].S) >= ((p[i].F - p[j].F) ^ (p[i].F - p[j].F));
}

const int FX = 60; ////////

vector<int> vx, vy;    

vector<int> val, fs;
vector<int> stock;

void push(int &lst, int x){
    fs.PB(lst);
    lst = sz(val);
    val.PB(x);
}

struct node{
    set<pair<pii, int> > st;
    void add(int f, int s, int x){
	st.insert({{f, s}, x});
    }
    void ask(int pos){
	auto it = st.lower_bound( (pair<pii, int>){ {pos + 1, -1}, -1} );
	int bad = 3;
	while(it != st.begin()){
	    --it;
	    if(pos <= (it->F.S))
		stock.PB(it->S);
	    else{
		if(--bad == 0)
		    break;
	    }
	}
    }
};
struct node2{
    node2 *L = 0, *R = 0;
    node* seg = 0;
    void add(int f, int s, int f2, int s2, int x, int l = 0, int r = sz(vx)-1){
	if(f <= vx[l] && vx[r] <= s){
	    if(!seg)
		seg = new node();
	    seg->add(f2, s2, x);
	    return;
	}
	if(r-l == 1)
	    return;
	int mid = (l+r) >> 1;	
	if(max(f, vx[l]) < min(s, vx[mid])){
	    if(!L)
		L = new node2();
	    L->add(f, s, f2, s2, x, l, mid);
	}
	if(max(f, vx[mid]) < min(s, vx[r])){
	    if(!R)
		R = new node2();
	    R->add(f, s, f2, s2, x, mid, r);
	}
    }
    void ask(int pos, int pos2, int l = 0, int r = sz(vx)-1){
	if(seg)
	    seg->ask(pos2);
	if(r-l == 1)
	    return;
	int mid = (l+r) >> 1;
	if(pos < vx[mid] && L)
	    L->ask(pos, pos2, l, mid);
	if(vx[mid] <= pos && R)
	    R->ask(pos, pos2, mid, r);	    
    }
};


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

    node2* root = new node2();
    
    int n;
    cin >> n;

    for(int i = 0; i < n; i++){
	cin >> p[i].F.F >> p[i].F.S >> p[i].S;
	
	vx.PB(p[i].F.F - p[i].S);
	vx.PB(p[i].F.F + p[i].S + 1);
	
	vy.PB(p[i].F.S - p[i].S);
	vy.PB(p[i].F.S + p[i].S + 1);
	
	arr[i] = i;
    }
    auto cmp = [](int i, int j){
		   return (p[i].S == p[j].S ? i > j : p[i].S < p[j].S);
	       };
    sort(arr, arr + n, cmp);

    sort(vx.begin(), vx.end());
    vx.resize( unique(vx.begin(), vx.end()) - vx.begin() );

    sort(vy.begin(), vy.end());
    vy.resize( unique(vy.begin(), vy.end()) - vy.begin() );

    for(int i = n-1; i >= 0; i--){
	int I = arr[i];
	stock.clear();
	//	cout << "IN " << I+1 << endl;
	for(int msk = 0; msk < 4; msk++)
	    root->ask(p[I].F.F + (bit(msk, 0) ? 1 : -1) * p[I].S, p[I].F.S + (bit(msk, 1) ? 1 : -1) * p[I].S);
	for(int id : stock){
	    //	    cout << "STOCK " << id+1 << endl;
	    if(ok(I, id)){
		if(ans[I] == 0 || cmp(ans[I] - 1, id))
		    ans[I] = id + 1;
	    }
	}
	if(ans[I] == 0){
	    ans[I] = I + 1;
	    root->add(p[I].F.F - p[I].S, p[I].F.F + p[I].S + 1, p[I].F.S - p[I].S, p[I].F.S + p[I].S + 1, I);
	}
    }
    for(int i = 0; i < n; i++){
	cout << ans[i] << " ";
    }
    return cout << endl, 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 1 ms 384 KB Output is correct
13 Correct 1 ms 384 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 1 ms 384 KB Output is correct
16 Correct 2 ms 384 KB Output is correct
17 Correct 1 ms 384 KB Output is correct
18 Correct 2 ms 384 KB Output is correct
19 Correct 6 ms 640 KB Output is correct
20 Correct 6 ms 640 KB Output is correct
21 Correct 6 ms 640 KB Output is correct
22 Correct 11 ms 2304 KB Output is correct
23 Correct 18 ms 3500 KB Output is correct
24 Correct 11 ms 2048 KB Output is correct
25 Correct 9 ms 1664 KB Output is correct
26 Correct 10 ms 2048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 343 ms 13376 KB Output is correct
2 Correct 346 ms 13228 KB Output is correct
3 Correct 353 ms 13004 KB Output is correct
4 Correct 339 ms 13260 KB Output is correct
5 Correct 506 ms 17740 KB Output is correct
6 Correct 725 ms 56000 KB Output is correct
7 Correct 608 ms 24384 KB Output is correct
8 Correct 674 ms 33856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 519 ms 60600 KB Output is correct
3 Correct 1563 ms 178380 KB Output is correct
4 Correct 1569 ms 177644 KB Output is correct
5 Correct 1945 ms 162224 KB Output is correct
6 Correct 786 ms 65760 KB Output is correct
7 Correct 298 ms 31332 KB Output is correct
8 Correct 34 ms 4724 KB Output is correct
9 Correct 1719 ms 180544 KB Output is correct
10 Correct 2552 ms 144448 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1201 ms 164424 KB Output is correct
2 Correct 709 ms 79052 KB Output is correct
3 Correct 1825 ms 33472 KB Output is correct
4 Correct 780 ms 90432 KB Output is correct
5 Correct 780 ms 84300 KB Output is correct
6 Correct 1286 ms 17728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 1 ms 384 KB Output is correct
13 Correct 1 ms 384 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 1 ms 384 KB Output is correct
16 Correct 2 ms 384 KB Output is correct
17 Correct 1 ms 384 KB Output is correct
18 Correct 2 ms 384 KB Output is correct
19 Correct 6 ms 640 KB Output is correct
20 Correct 6 ms 640 KB Output is correct
21 Correct 6 ms 640 KB Output is correct
22 Correct 11 ms 2304 KB Output is correct
23 Correct 18 ms 3500 KB Output is correct
24 Correct 11 ms 2048 KB Output is correct
25 Correct 9 ms 1664 KB Output is correct
26 Correct 10 ms 2048 KB Output is correct
27 Correct 11 ms 896 KB Output is correct
28 Correct 12 ms 896 KB Output is correct
29 Correct 13 ms 896 KB Output is correct
30 Correct 30 ms 5760 KB Output is correct
31 Correct 22 ms 4096 KB Output is correct
32 Correct 21 ms 4096 KB Output is correct
33 Correct 120 ms 4704 KB Output is correct
34 Correct 121 ms 4704 KB Output is correct
35 Correct 130 ms 4708 KB Output is correct
36 Correct 309 ms 43104 KB Output is correct
37 Correct 315 ms 44156 KB Output is correct
38 Correct 373 ms 48888 KB Output is correct
39 Correct 317 ms 8676 KB Output is correct
40 Correct 306 ms 8672 KB Output is correct
41 Correct 315 ms 8672 KB Output is correct
42 Correct 305 ms 8548 KB Output is correct
43 Correct 216 ms 26084 KB Output is correct
44 Correct 220 ms 26208 KB Output is correct
45 Correct 215 ms 26080 KB Output is correct
46 Correct 217 ms 26084 KB Output is correct
47 Correct 225 ms 26340 KB Output is correct
48 Correct 213 ms 26208 KB Output is correct
49 Correct 213 ms 26084 KB Output is correct
50 Correct 223 ms 26208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 1 ms 384 KB Output is correct
13 Correct 1 ms 384 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 1 ms 384 KB Output is correct
16 Correct 2 ms 384 KB Output is correct
17 Correct 1 ms 384 KB Output is correct
18 Correct 2 ms 384 KB Output is correct
19 Correct 6 ms 640 KB Output is correct
20 Correct 6 ms 640 KB Output is correct
21 Correct 6 ms 640 KB Output is correct
22 Correct 11 ms 2304 KB Output is correct
23 Correct 18 ms 3500 KB Output is correct
24 Correct 11 ms 2048 KB Output is correct
25 Correct 9 ms 1664 KB Output is correct
26 Correct 10 ms 2048 KB Output is correct
27 Correct 343 ms 13376 KB Output is correct
28 Correct 346 ms 13228 KB Output is correct
29 Correct 353 ms 13004 KB Output is correct
30 Correct 339 ms 13260 KB Output is correct
31 Correct 506 ms 17740 KB Output is correct
32 Correct 725 ms 56000 KB Output is correct
33 Correct 608 ms 24384 KB Output is correct
34 Correct 674 ms 33856 KB Output is correct
35 Correct 0 ms 384 KB Output is correct
36 Correct 519 ms 60600 KB Output is correct
37 Correct 1563 ms 178380 KB Output is correct
38 Correct 1569 ms 177644 KB Output is correct
39 Correct 1945 ms 162224 KB Output is correct
40 Correct 786 ms 65760 KB Output is correct
41 Correct 298 ms 31332 KB Output is correct
42 Correct 34 ms 4724 KB Output is correct
43 Correct 1719 ms 180544 KB Output is correct
44 Correct 2552 ms 144448 KB Output is correct
45 Correct 1201 ms 164424 KB Output is correct
46 Correct 709 ms 79052 KB Output is correct
47 Correct 1825 ms 33472 KB Output is correct
48 Correct 780 ms 90432 KB Output is correct
49 Correct 780 ms 84300 KB Output is correct
50 Correct 1286 ms 17728 KB Output is correct
51 Correct 11 ms 896 KB Output is correct
52 Correct 12 ms 896 KB Output is correct
53 Correct 13 ms 896 KB Output is correct
54 Correct 30 ms 5760 KB Output is correct
55 Correct 22 ms 4096 KB Output is correct
56 Correct 21 ms 4096 KB Output is correct
57 Correct 120 ms 4704 KB Output is correct
58 Correct 121 ms 4704 KB Output is correct
59 Correct 130 ms 4708 KB Output is correct
60 Correct 309 ms 43104 KB Output is correct
61 Correct 315 ms 44156 KB Output is correct
62 Correct 373 ms 48888 KB Output is correct
63 Correct 317 ms 8676 KB Output is correct
64 Correct 306 ms 8672 KB Output is correct
65 Correct 315 ms 8672 KB Output is correct
66 Correct 305 ms 8548 KB Output is correct
67 Correct 216 ms 26084 KB Output is correct
68 Correct 220 ms 26208 KB Output is correct
69 Correct 215 ms 26080 KB Output is correct
70 Correct 217 ms 26084 KB Output is correct
71 Correct 225 ms 26340 KB Output is correct
72 Correct 213 ms 26208 KB Output is correct
73 Correct 213 ms 26084 KB Output is correct
74 Correct 223 ms 26208 KB Output is correct
75 Correct 399 ms 22368 KB Output is correct
76 Correct 425 ms 22012 KB Output is correct
77 Correct 395 ms 22348 KB Output is correct
78 Correct 373 ms 21952 KB Output is correct
79 Correct 611 ms 23880 KB Output is correct
80 Correct 382 ms 22216 KB Output is correct
81 Correct 1422 ms 178760 KB Output is correct
82 Correct 1341 ms 163268 KB Output is correct
83 Correct 1362 ms 163812 KB Output is correct
84 Correct 1921 ms 201676 KB Output is correct
85 Correct 1426 ms 173520 KB Output is correct
86 Correct 1279 ms 159696 KB Output is correct
87 Execution timed out 3099 ms 210708 KB Time limit exceeded
88 Halted 0 ms 0 KB -