10358 2024. 03. 31 22:09:13 111 Úthálózatbővítés cpp17 Elfogadva 100/100 493ms 62244 KiB
#pragma GCC optimize("Ofast")

#include<bits/stdc++.h>
using namespace std;

#define ll long long

#define INF (int)1e8

struct P{
	int x,y;
};

struct L{
	P l,h;
};

bool operator==(P a,P b){
	return a.x==b.x&&a.y==b.y;
}

bool operator<(P a,P b){
	return a.x<b.x||a.x==b.x&&a.y<b.y;
}

P operator+(P a,P b){
	return P{a.x+b.x,a.y+b.y};
}

P operator-(P a,P b){
	return P{a.x-b.x,a.y-b.y};
}

ll dot(P a,P b){
	return (ll)a.x*b.x+(ll)a.y*b.y;
}

ll cross(P a,P b){
	return (ll)a.x*b.y-(ll)b.x*a.y;
}

ll sq(ll x){
	return x*x;
}

int sign(ll x){
	return (x>0)-(x<0);
}

int orient(P a,P b,P c){
	return sign(cross(a-b,c-b));
}

int right(P a,P b,P c){
	return cross(a-b,c-b)>=0;
}

int test(L a,P b){
	return cross(a.h-a.l,b-a.l)==0&&dot(a.h-a.l,b-a.l)>dot(a.h-a.l,a.l-a.l)&&dot(a.h-a.l,b-a.l)<dot(a.h-a.l,a.h-a.l);
}

int test(L a,L b){
	if(a.l==b.l){
		return test(a,b.h)||test(b,a.h);
	}
	if(a.l==b.h){
		return test(a,b.l)||test(b,a.h);
	}
	if(a.h==b.l){
		return test(a,b.h)||test(b,a.l);
	}
	if(a.h==b.h){
		return test(a,b.l)||test(b,a.l);
	}
	int o1=orient(a.l,a.h,b.l);
	int o2=orient(a.l,a.h,b.h);
	int o3=orient(b.l,b.h,a.l);
	int o4=orient(b.l,b.h,a.h);
	return o1!=o2&&o3!=o4;
}

bool operator<(L a,L b){
	if(a.l==b.h){
		return false;
	}
	if(a.h==b.l){
		return true;
	}
	int x=!right(b.h,b.l,a.l);
	int y=!right(a.h,a.l,b.l);
	if(x==y){
		x=!right(b.h,b.l,a.h);
		y=!right(a.h,a.l,b.h);
	}
	return x>y;
}

ll length(L a){
	return sq(a.h.x-a.l.x)+sq(a.h.y-a.l.y);
}

int ru() {
	int neg=1;
	char p;
	while (!isdigit(p=getchar_unlocked())) {
		if(p=='-')neg=-1;
	}
	int res = 0;
	while (isdigit(p)) {
		res *= 10;
		res += p - '0';
		p=getchar_unlocked();
	}
	return res*neg;
}

void wc(char c) {
	putchar_unlocked(c);
}

void wu(int i) {
	int x = 1;
	int c = 1;
	while (x <= i / 10) {
		x *= 10;
		c++;
	}
	while (c--) {
		int d = i / x;
		wc('0' + d);
		i -= d * x;
		i *= 10;
	}
}

signed main(){
	int N=ru();
	vector<pair<P,int>>v(N+1);
	for(int i=0;i<=N;i++){
		v[i].first={ru(),ru()};
		v[i].second=i;
	}
	vector<L>e;
	for(int i=1;i<=N;i++){
		e.push_back(L{v[0].first,v[i].first});
	}
	for(int i=0;i<N-1;i++){
		int a=ru(),b=ru();
		e.push_back(L{v[a].first,v[b].first});
	}
	for(auto&p:e){
		if(p.h<p.l){
			swap(p.l,p.h);
		}
	}
	vector<int>ans(N,1);
	vector<tuple<P,int,int>>q;
	for(int i=0;i<e.size();i++){
		q.emplace_back(e[i].l,1,i);
		q.emplace_back(e[i].h,2,i);
	}
	sort(q.begin(),q.end());
	set<pair<L,int>>s;
	s.emplace(L{P{-INF,-INF},P{INF,-INF}},-1);
	s.emplace(L{P{-INF,INF},P{INF,INF}},-1);
	for(auto[p,o,i]:q){
		if(o==1){
			auto it=s.insert(pair<L,int>(e[i],i)).first;
			auto lt=prev(it);
			auto rt=next(it);
			while(test(it->first,lt->first)){
				if(it->second<N&&(lt->second>=N||length(it->first)>length(lt->first))){
					ans[it->second]=0;
					it=s.erase(it);
				}
				else{
					ans[lt->second]=0;
					lt=prev(s.erase(lt));
				}
			}
			while(test(it->first,rt->first)){
				if(it->second<N&&(rt->second>=N||length(it->first)>length(rt->first))){
					ans[it->second]=0;
					it=prev(s.erase(it));
				}
				else{
					ans[rt->second]=0;
					rt=s.erase(rt);
				}
			}
		}
		if(o==2){
			auto it=s.find(pair<L,int>(e[i],i));
			if(it!=s.end()){
				it=s.erase(it);
				auto lt=prev(it);
				while(test(it->first,lt->first)){
					if(it->second<N&&(lt->second>=N||length(it->first)>length(lt->first))){
						ans[it->second]=0;
						it=s.erase(it);
					}
					else{
						ans[lt->second]=0;
						lt=prev(s.erase(lt));
					}
				}
			}
		}
	}
	wu(count(ans.begin(),ans.end(),1));wc('\n');
	for(int i=0;i<N;i++){
		if(ans[i]){
			wu(i+1);wc(' ');
		}
	}
	wc('\n');
	return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1880 KiB
2 Elfogadva 148ms 26972 KiB
subtask2 10/10
3 Elfogadva 3ms 4128 KiB
4 Elfogadva 3ms 4224 KiB
5 Elfogadva 3ms 4516 KiB
6 Elfogadva 4ms 4880 KiB
7 Elfogadva 4ms 5264 KiB
subtask3 20/20
8 Elfogadva 3ms 4980 KiB
9 Elfogadva 3ms 5084 KiB
10 Elfogadva 4ms 5364 KiB
11 Elfogadva 13ms 7164 KiB
12 Elfogadva 25ms 8648 KiB
13 Elfogadva 123ms 21032 KiB
14 Elfogadva 277ms 39528 KiB
15 Elfogadva 23ms 15888 KiB
16 Elfogadva 52ms 20592 KiB
17 Elfogadva 92ms 27456 KiB
subtask4 10/10
18 Elfogadva 3ms 11560 KiB
19 Elfogadva 9ms 12716 KiB
20 Elfogadva 13ms 14804 KiB
21 Elfogadva 17ms 15472 KiB
22 Elfogadva 14ms 14236 KiB
subtask5 30/30
23 Elfogadva 4ms 13028 KiB
24 Elfogadva 21ms 15668 KiB
25 Elfogadva 3ms 12812 KiB
26 Elfogadva 4ms 12996 KiB
27 Elfogadva 16ms 14844 KiB
28 Elfogadva 29ms 17224 KiB
29 Elfogadva 39ms 20008 KiB
30 Elfogadva 34ms 21492 KiB
31 Elfogadva 52ms 25420 KiB
32 Elfogadva 127ms 30452 KiB
subtask6 30/30
33 Elfogadva 89ms 34848 KiB
34 Elfogadva 59ms 31400 KiB
35 Elfogadva 270ms 49120 KiB
36 Elfogadva 250ms 48312 KiB
37 Elfogadva 250ms 48312 KiB
38 Elfogadva 354ms 58368 KiB
39 Elfogadva 360ms 58692 KiB
40 Elfogadva 493ms 61448 KiB
41 Elfogadva 453ms 62244 KiB
42 Elfogadva 270ms 33964 KiB