103572024-03-31 22:07:10111Úthálózatbővítéscpp17Időlimit túllépés 70/100527ms62244 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())) {
		if(p=='-')neg=-1;
	}
	int res = 0;
	while (isdigit(p)) {
		res *= 10;
		res += p - '0';
		p=getchar();
	}
	return res*neg;
}

void wc(char c) {
	putchar(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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1876 KiB
2Elfogadva156ms26984 KiB
subtask210/10
3Elfogadva3ms4120 KiB
4Elfogadva3ms4456 KiB
5Elfogadva3ms4504 KiB
6Elfogadva3ms4816 KiB
7Elfogadva4ms5224 KiB
subtask320/20
8Elfogadva3ms5056 KiB
9Elfogadva3ms5188 KiB
10Elfogadva4ms5692 KiB
11Elfogadva13ms7448 KiB
12Elfogadva25ms8940 KiB
13Elfogadva128ms21072 KiB
14Elfogadva275ms39736 KiB
15Elfogadva25ms16164 KiB
16Elfogadva54ms20860 KiB
17Elfogadva93ms27736 KiB
subtask410/10
18Elfogadva3ms11932 KiB
19Elfogadva9ms13008 KiB
20Elfogadva13ms15240 KiB
21Elfogadva18ms15880 KiB
22Elfogadva14ms14748 KiB
subtask530/30
23Elfogadva4ms13332 KiB
24Elfogadva21ms16268 KiB
25Elfogadva3ms13628 KiB
26Elfogadva3ms13692 KiB
27Elfogadva16ms15548 KiB
28Elfogadva29ms17564 KiB
29Elfogadva39ms20400 KiB
30Elfogadva35ms22100 KiB
31Elfogadva54ms25860 KiB
32Elfogadva128ms30796 KiB
subtask60/30
33Elfogadva92ms35064 KiB
34Elfogadva57ms31888 KiB
35Elfogadva273ms49116 KiB
36Elfogadva250ms48316 KiB
37Elfogadva257ms48312 KiB
38Elfogadva363ms58368 KiB
39Elfogadva374ms58688 KiB
40Időlimit túllépés527ms61452 KiB
41Elfogadva462ms62244 KiB
42Elfogadva268ms33688 KiB