1>3==true 求助
  • 板块学术版
  • 楼主Shiroko
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/10/5 12:04
  • 上次更新2023/11/5 11:58:15
查看原帖
1>3==true 求助
252015
Shiroko楼主2020/10/5 12:04
#include<bits/stdc++.h>
using namespace std;

int n,in[5005],tmp,lis[5005],tail,len,head[5005];

priority_queue<int,vector<int>,greater<int> >q;

struct line
{
	int xl,yl,xr,yr;
}a[5005];

struct EDGE
{
	int next,targ;
}Edge[25000005];

double calc(int p,int x)
{
	int Y=max(a[p].yl,a[p].yr),y=min(a[p].yl,a[p].yr);
	return (double)abs(a[p].yl>a[p].yr?a[p].xr:a[p].xl-x)*(double)(Y-y)/(double)(a[p].xr-a[p].xl)+y;
}

bool blocked(int i,int j)
{
	if(a[j].xl<=a[i].xr && a[j].xr>=a[i].xl)
	{
		if(a[j].xl<=a[i].xl && a[j].xr>=a[i].xr)
		{
			double yl=calc(j,a[i].xl),yr=calc(j,a[i].xr);
			if(yl>a[i].yl && yr>a[i].yr)//这里炸了 调试第一次  yl==1 a[i].yl==3 yr==1.5 a[i].yr==2 但是会直接跳进下面的return 
				return true;
		}
		else if(a[j].xl>=a[i].xl && a[j].xr<=a[i].xr)
		{
			double yl=calc(i,a[j].xl),yr=calc(i,a[j].xr);
			if(yl<a[j].yl && yr<a[j].yr)
				return true;
		}
		else
		{
			bool f1=false,f2=false;
			double yl,yr;
			if(a[j].xl>a[i].xl)
			{
				yl=calc(i,a[j].xl);
				if(yl<a[j].yl)
					f1=true;
			}
			if(a[j].xl<a[i].xr)
			{
				yr=calc(i,a[j].xr);
				if(yr<a[j].yr)
					f2=true;
			}
			if(a[j].xl<=a[i].xl)
			{
				yl=calc(j,a[i].xl);
				if(yl>a[i].yl)
					f1=true;
			}
			if(a[j].xr>=a[i].xr)
			{
				yr=calc(j,a[i].xr);
				if(yr>a[i].yr)
					f2=true;
			}
			return f1 && f2;
		}
	}
}

void add(int u,int v)
{
	Edge[++len]={head[u],v};
	head[u]=len;
}

void Topology_Sort()
{
	for(int i=1;i<=n;i++)
		if(!in[i])
			q.push(i);
	while(!q.empty())
	{
		tmp=q.top();
		q.pop();
		lis[++tail]=tmp;
		for(int i=head[tmp];i;i=Edge[i].next)
		{
			in[Edge[i].targ]--;
			if(!in[Edge[i].targ])
				q.push(Edge[i].targ);
		}
	}
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].xl>>a[i].yl>>a[i].xr>>a[i].yr;
		if(a[i].xl>a[i].xr)
		{
			swap(a[i].xl,a[i].xr);
			swap(a[i].yl,a[i].yr);
		}
	}
		
	for(int i=1;i<n;i++)
		for(int j=i+1;j<=n;j++)
		{
			if(blocked(i,j))
			{
				add(i,j);
				in[j]++;
			}
			else if(blocked(j,i))
			{
				add(j,i);
				in[i]++;
			}
		}
	Topology_Sort();
	for(int i=1;i<=tail;i++)
		cout<<lis[i]<<" ";
}

输入

4
1 3 2 2
1 1 3 2
2 4 7 3
3 3 5 3

标准输出

2 1 4 3

我的输出

1 2 3 4

主要问题在我注释的位置

我在调试的时候炸了 运行的时候也会错

2020/10/5 12:04
加载中...