Submission #252399

# Submission time Handle Problem Language Result Execution time Memory
252399 2020-07-25T12:57:25 Z shayan_p Circle selection (APIO18_circle_selection) C++14
0 / 100
1624 ms 1048580 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;

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 = 15;

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

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

struct node{
    node *L = 0, *R = 0;
    int lst = -1;
    void add(int f, int s, int x, int l, int r){
	if(f <= l && r <= s){
	    push(lst, x);
	    return;
	}
	if(r-l == 1)
	    return;
	int mid = (l+r) / 2;	
	if(max(f, l) < min(s, mid)){
	    if(!L)
		L = new node();
	    L->add(f, s, x, l, mid);
	}
	if(max(f, mid) < min(s, r)){
	    if(!R)
		R = new node();
	    R->add(f, s, x, mid, r);
	}
    }
    void ask(int pos, int l, int r){
	if(sz(stock) == FX)
	    return;
	int pt = lst;
	while(sz(stock) < FX && pt != -1){
	    stock.PB(val[pt]);
	    pt = fs[pt];
	}
	if(r-l == 1)
	    return;
	int mid = (l+r) / 2;
	if(pos < mid && L)
	    L->ask(pos, l, mid);
	if(mid <= pos && R)
	    R->ask(pos, mid, r);	    
    }
};
struct node2{
    node2 *L = 0, *R = 0;
    node* seg = 0;
    void add(int f, int s, int f2, int s2, int x, int l, int r){
	if(f <= l && r <= s){
	    if(!seg)
		seg = new node();
	    seg->add(f2, s2, x, -inf, inf);
	    return;
	}
	if(r-l == 1)
	    return;
	int mid = (l+r) / 2;	
	if(max(f, l) < min(s, mid)){
	    if(!L)
		L = new node2();
	    L->add(f, s, f2, s2, x, l, mid);
	}
	if(max(f, mid) < min(s, r)){
	    if(!R)
		R = new node2();
	    R->add(f, s, f2, s2, x, mid, r);
	}
    }
    void ask(int pos, int pos2, int l, int r){
	if(seg)
	    seg->ask(pos2, -inf, inf);
	if(r-l == 1)
	    return;
	int mid = (l+r) / 2;
	if(pos < mid && L)
	    L->ask(pos, pos2, l, mid);
	if(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;
	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);
    for(int i = n-1; i >= 0; i--){
	int I = arr[i];
	stock.clear();
	root->ask(p[I].F.F, p[I].F.S, -inf, inf);
	for(int id : stock){
	    if(ok(I, id)){
		if(ans[I] == 0 || cmp(ans[I], id))
		    ans[I] = id + 1;
	    }
	}
	if(ans[I] == 0){
	    ans[I] = I + 1;
	    root->add( int( max(ll(-inf), 1ll * p[I].F.F - 2ll * p[I].S) ),
		       int( min(ll(inf), 1ll * p[I].F.F + 2ll * p[I].S + 1) ),
		       int ( max(ll(-inf), 1ll * p[I].F.S - 2ll * p[I].S) ),
		       int( min(ll(inf), 1ll * p[I].F.S + 2ll * p[I].S + 1) ),
		       I,
		       -inf,
		       inf
		       );
	}
    }
    for(int i = 0; i < n; i++){
	cout << ans[i] << " ";
    }
    return cout << endl, 0;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 512 KB Output is correct
3 Correct 1 ms 512 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 1 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 1 ms 512 KB Output is correct
10 Incorrect 1 ms 384 KB Output isn't correct
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 185 ms 8440 KB Output is correct
2 Incorrect 193 ms 8568 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 1408 KB Output is correct
2 Runtime error 1623 ms 1048580 KB Execution killed with signal 9 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 1624 ms 1048580 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 512 KB Output is correct
3 Correct 1 ms 512 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 1 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 1 ms 512 KB Output is correct
10 Incorrect 1 ms 384 KB Output isn't correct
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 512 KB Output is correct
3 Correct 1 ms 512 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 1 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 1 ms 512 KB Output is correct
10 Incorrect 1 ms 384 KB Output isn't correct
11 Halted 0 ms 0 KB -