74分求助(
查看原帖
74分求助(
377969
george0929楼主2024/1/25 19:57

rt,思路是一次函数判断是否发生碰撞,然后拓扑排序。

#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int> V[5005];
int in[5005];
long double x[5005],y[5005],x2[5005],y2[5005];
long double k[5005],b[5005];
signed main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i]>>x2[i]>>y2[i];
		if(x[i]>x2[i]){
			swap(x[i],x2[i]);
			swap(y[i],y2[i]);
		}
		if(x[i]==x2[i]){
			k[i]=0,b[i]=max(y[i],y2[i]);
		}else{
			k[i]=(y[i]-y2[i])/(x[i]-x2[i]);
		b[i]=y[i]-x[i]*k[i];
		}
		
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j) continue;
			if(k[i]==0&&k[j]==0&&x[i]==x2[i]&&x[j]==x2[j]){
				if(y[i]<y[j]&&x[i]==x[j]){
					V[i].push_back(j);
					in[j]++;
					continue; 
				}
			}
			if((x[i]<=x[j]&&x[j]<=x2[i]&&k[i]*x[j]+b[i]<y[j])
			||(x[i]<=x2[j]&&x2[j]<=x2[i]&&k[i]*x2[j]+b[i]<y2[j])){
				V[i].push_back(j);
				in[j]++;
			}
		}
	}
	queue<int> Q;
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			Q.push(i);
		}
	}
	while(!Q.empty()){
		int u=Q.front();
		Q.pop();
		cout<<u<<" ";
		for(int v:V[u]){
			in[v]--;
			if(in[v]==0){
				Q.push(v);
			}
		}
	}
}
2024/1/25 19:57
加载中...