103482024-03-31 21:25:08111Úthálózatbővítéscpp17Hibás válasz 0/100377ms65080 KiB
#include<bits/stdc++.h>
using namespace std;

#define int 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};
}

istream&operator>>(istream&is,P&p){
	return is>>p.x>>p.y;
}

ostream&operator<<(ostream&os,P p){
	return os<<'('<<p.x<<','<<p.y<<')';
}

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

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

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,L b){
	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);
	if((o1==0)+(o2==0)+(o3==0)+(o4==0)==1){
		return true;
	}
	if(a.l==b.l||a.l==b.h||a.h==b.l||a.h==b.h){
		return false;
	}
	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;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N;
	cin>>N;
	vector<pair<P,int>>v(N+1);
	for(int i=0;i<=N;i++){
		cin>>v[i].first;
		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,b;
		cin>>a>>b;
		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){
					ans[it->second]=0;
					it=s.erase(it);
				}
				else{
					if(lt->second>=N){
						exit(1);
					}
					ans[lt->second]=0;
					lt=prev(s.erase(lt));
				}
			}
			while(test(it->first,rt->first)){
				if(it->second<N){
					ans[it->second]=0;
					it=prev(s.erase(it));
				}
				else{
					if(rt->second>=N){
						exit(1);
					}
					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){
						ans[it->second]=0;
						it=s.erase(it);
					}
					else{
						if(lt->second>=N){
							exit(1);
						}
						ans[lt->second]=0;
						lt=prev(s.erase(lt));
					}
				}
			}
		}
	}
	cout<<count(ans.begin(),ans.end(),1)<<'\n';
	for(int i=0;i<N;i++){
		if(ans[i]){
			cout<<i+1<<' ';
		}
	}
	cout<<'\n';
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Hibás válasz3ms2028 KiB
2Elfogadva211ms49816 KiB
subtask20/10
3Elfogadva3ms4252 KiB
4Futási hiba3ms4480 KiB
5Futási hiba3ms4732 KiB
6Elfogadva4ms5228 KiB
7Elfogadva4ms5316 KiB
subtask30/20
8Elfogadva3ms4856 KiB
9Elfogadva3ms4900 KiB
10Elfogadva4ms5536 KiB
11Elfogadva17ms7884 KiB
12Elfogadva32ms11456 KiB
13Futási hiba165ms32584 KiB
14Elfogadva377ms61208 KiB
15Hibás válasz78ms19668 KiB
16Futási hiba50ms26120 KiB
17Futási hiba61ms35260 KiB
subtask40/10
18Futási hiba3ms9316 KiB
19Futási hiba8ms11808 KiB
20Hibás válasz37ms15720 KiB
21Futási hiba17ms16068 KiB
22Elfogadva19ms13304 KiB
subtask50/30
23Elfogadva6ms11212 KiB
24Futási hiba19ms16248 KiB
25Elfogadva3ms10512 KiB
26Elfogadva4ms10708 KiB
27Elfogadva19ms13700 KiB
28Elfogadva39ms17720 KiB
29Elfogadva54ms23304 KiB
30Hibás válasz119ms29464 KiB
31Futási hiba50ms30228 KiB
32Elfogadva173ms39644 KiB
subtask60/30
33Futási hiba86ms44348 KiB
34Hibás válasz209ms45144 KiB
35Elfogadva375ms62820 KiB
36Futási hiba236ms62264 KiB
37Futási hiba237ms62264 KiB
38Futási hiba127ms64960 KiB
39Futási hiba130ms65080 KiB
40Futási hiba143ms65012 KiB
41Futási hiba120ms65012 KiB
42Elfogadva372ms55240 KiB