답안 #252484

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
252484 2020-07-25T17:00:53 Z shayan_p 원 고르기 (APIO18_circle_selection) C++14
72 / 100
3000 ms 188452 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 = 7;
	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 0 ms 384 KB Output is correct
2 Correct 0 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 0 ms 384 KB Output is correct
8 Correct 0 ms 384 KB Output is correct
9 Correct 0 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 0 ms 384 KB Output is correct
12 Correct 0 ms 384 KB Output is correct
13 Correct 0 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 1 ms 384 KB Output is correct
17 Correct 1 ms 384 KB Output is correct
18 Correct 1 ms 384 KB Output is correct
19 Correct 6 ms 640 KB Output is correct
20 Correct 5 ms 640 KB Output is correct
21 Correct 6 ms 640 KB Output is correct
22 Correct 11 ms 2208 KB Output is correct
23 Correct 18 ms 3456 KB Output is correct
24 Correct 10 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 341 ms 13260 KB Output is correct
2 Correct 352 ms 13260 KB Output is correct
3 Correct 346 ms 13008 KB Output is correct
4 Correct 341 ms 13256 KB Output is correct
5 Correct 529 ms 18008 KB Output is correct
6 Correct 745 ms 60512 KB Output is correct
7 Correct 624 ms 29004 KB Output is correct
8 Correct 696 ms 38604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 518 ms 60900 KB Output is correct
3 Correct 1603 ms 186580 KB Output is correct
4 Correct 1608 ms 185752 KB Output is correct
5 Correct 2182 ms 170188 KB Output is correct
6 Correct 809 ms 69976 KB Output is correct
7 Correct 305 ms 33380 KB Output is correct
8 Correct 36 ms 5236 KB Output is correct
9 Correct 1797 ms 188452 KB Output is correct
10 Execution timed out 3055 ms 152756 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 1219 ms 165788 KB Output is correct
2 Correct 749 ms 85952 KB Output is correct
3 Correct 2172 ms 41652 KB Output is correct
4 Correct 778 ms 97872 KB Output is correct
5 Correct 758 ms 91824 KB Output is correct
6 Correct 1567 ms 26112 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 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 0 ms 384 KB Output is correct
8 Correct 0 ms 384 KB Output is correct
9 Correct 0 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 0 ms 384 KB Output is correct
12 Correct 0 ms 384 KB Output is correct
13 Correct 0 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 1 ms 384 KB Output is correct
17 Correct 1 ms 384 KB Output is correct
18 Correct 1 ms 384 KB Output is correct
19 Correct 6 ms 640 KB Output is correct
20 Correct 5 ms 640 KB Output is correct
21 Correct 6 ms 640 KB Output is correct
22 Correct 11 ms 2208 KB Output is correct
23 Correct 18 ms 3456 KB Output is correct
24 Correct 10 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 884 KB Output is correct
29 Correct 16 ms 896 KB Output is correct
30 Correct 33 ms 5752 KB Output is correct
31 Correct 24 ms 4076 KB Output is correct
32 Correct 22 ms 4000 KB Output is correct
33 Correct 118 ms 4836 KB Output is correct
34 Correct 118 ms 4704 KB Output is correct
35 Correct 128 ms 4704 KB Output is correct
36 Correct 346 ms 45028 KB Output is correct
37 Correct 318 ms 46816 KB Output is correct
38 Correct 362 ms 51812 KB Output is correct
39 Correct 391 ms 9804 KB Output is correct
40 Correct 389 ms 9736 KB Output is correct
41 Correct 387 ms 9696 KB Output is correct
42 Correct 370 ms 10204 KB Output is correct
43 Correct 216 ms 28768 KB Output is correct
44 Correct 226 ms 28768 KB Output is correct
45 Correct 221 ms 28772 KB Output is correct
46 Correct 218 ms 28764 KB Output is correct
47 Correct 221 ms 28864 KB Output is correct
48 Correct 237 ms 28772 KB Output is correct
49 Correct 215 ms 28768 KB Output is correct
50 Correct 238 ms 28768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 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 0 ms 384 KB Output is correct
8 Correct 0 ms 384 KB Output is correct
9 Correct 0 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 0 ms 384 KB Output is correct
12 Correct 0 ms 384 KB Output is correct
13 Correct 0 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 1 ms 384 KB Output is correct
17 Correct 1 ms 384 KB Output is correct
18 Correct 1 ms 384 KB Output is correct
19 Correct 6 ms 640 KB Output is correct
20 Correct 5 ms 640 KB Output is correct
21 Correct 6 ms 640 KB Output is correct
22 Correct 11 ms 2208 KB Output is correct
23 Correct 18 ms 3456 KB Output is correct
24 Correct 10 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 341 ms 13260 KB Output is correct
28 Correct 352 ms 13260 KB Output is correct
29 Correct 346 ms 13008 KB Output is correct
30 Correct 341 ms 13256 KB Output is correct
31 Correct 529 ms 18008 KB Output is correct
32 Correct 745 ms 60512 KB Output is correct
33 Correct 624 ms 29004 KB Output is correct
34 Correct 696 ms 38604 KB Output is correct
35 Correct 0 ms 384 KB Output is correct
36 Correct 518 ms 60900 KB Output is correct
37 Correct 1603 ms 186580 KB Output is correct
38 Correct 1608 ms 185752 KB Output is correct
39 Correct 2182 ms 170188 KB Output is correct
40 Correct 809 ms 69976 KB Output is correct
41 Correct 305 ms 33380 KB Output is correct
42 Correct 36 ms 5236 KB Output is correct
43 Correct 1797 ms 188452 KB Output is correct
44 Execution timed out 3055 ms 152756 KB Time limit exceeded