90分求助
  • 板块P1222 三角形
  • 楼主laochen0
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/22 11:02
  • 上次更新2024/1/22 14:27:17
查看原帖
90分求助
1032788
laochen0楼主2024/1/22 11:02

第9测试点TLE 悬关

#include<bits/stdc++.h>
using namespace std;
struct tri
{
	int x,y,m,s;
	bool operator==(const tri &p)
    {
        return (this->x==p.x)&&(this->y==p.y)&&(this->m==p.m);
    }
};
deque<tri> t;
int n;
double sum;
int t_add(tri a,int l)
{
	int s=t.size();
	int i;
	bool f=true;
	for(i=l;i<s;i++)
		if(t[i]==a)
		{
			t[i].s++;
			f=false;
			break;
		}
	if(f)
	{
		a.s=1;
		t.push_back(a);
	}
	return f;
}
double trisize(tri a)
{
	return (a.m*1.0)*(a.m*1.0)/2.0;
}
int aljdge(tri a,tri b)//A被B完全盖住 al:all 
{
	if(a.x<b.x||a.y<b.y)return 0;
	if(a.m>b.m)return 0;
	if(a.x+a.m+a.y-b.y>b.x+b.m)return 0;
	return 1; 
}
int rcjdge(tri a,tri b)//A的右角被B盖住 rc:right corner
{
	if(a.x>=b.x||a.x+a.m<=b.x)return 0;
	if(a.y<b.y||a.y>b.y+b.m)return 0;
	if(a.x+a.m-b.x+a.y>b.y+b.m)return 0;
	return 1;
}
double rcsize(tri a,tri b)
{
	int s=a.x+a.m-b.x;
	return (s*1.0)*(s*1.0)/2.0;
}
tri rctri(tri a,tri b)
{
	tri r;
	r.x=b.x;
	r.y=a.y;
	r.m=a.x+a.m-b.x;
	return r;
}
int ucjdge(tri a,tri b)//A的上角被B盖住 uc:up corner
{
	if(a.y>=b.y||a.y+a.m<=b.y)return 0;
	if(a.x<b.x||a.x>b.x+b.m)return 0;
	if(a.x+a.m-b.y+a.y>b.x+b.m)return 0;
	return 1;
}
double ucsize(tri a,tri b)
{
	int s=a.y+a.m-b.y;
	return (s*1.0)*(s*1.0)/2.0;
}
tri uctri(tri a,tri b)
{
	tri r;
	r.x=a.x;
	r.y=b.y;
	r.m=a.y+a.m-b.y;
	return r;
}
int hyjdge(tri a,tri b)//A的斜边被B盖住 hy:hypotenuse
{
	if(a.x>=b.x||a.y>=b.y)return 0;
	if(a.x+a.m<=b.x||a.y+a.m<=b.y)return 0;
	if(b.x-a.x+b.y-a.y>=a.m)return 0;
	if(b.x+b.m-a.x+b.y-a.y<=a.m)return 0;
	return 1;
}
double hysize(tri a,tri b)
{
	int s=a.m-b.y+a.y-b.x+a.x;
	return (s*1.0)*(s*1.0)/2.0;
}
tri hytri(tri a,tri b)
{
	tri r;
	r.x=b.x;
	r.y=b.y;
	r.m=a.m-b.x+a.x-b.y+a.y;
	return r;
}
int main()
{
	int i,j,k,x;
	tri a,b;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>a.x>>a.y>>a.m;
		a.s=1;
		t.push_back(a);
	}
	x=1;
	while(!t.empty())
	{
		int l=t.size();
//		cout<<l<<endl;
		for(i=0;i<l;i++)
		{
			a=t[i];
//			printf("%d %d %d %d\n",a.x,a.y,a.m,a.s);
			sum+=x*trisize(a)*a.s;
			for(j=0;j<i;j++)
			{
				b=t[j];
				if(aljdge(a,b))t_add(a,l);
				if(rcjdge(a,b))t_add(rctri(a,b),l);
				if(ucjdge(a,b))t_add(uctri(a,b),l);
				if(hyjdge(a,b))t_add(hytri(a,b),l);
				if(aljdge(b,a))t_add(b,l);
				if(rcjdge(b,a))t_add(rctri(b,a),l);
				if(ucjdge(b,a))t_add(uctri(b,a),l);
				if(hyjdge(b,a))t_add(hytri(b,a),l);
			}
		}
		for(i=0;i<l;i++)
			t.pop_front();
		x=0-x;
//		printf("%.1f\n",sum);
//		cout<<endl;
	}
	printf("%.1f",sum);
}
2024/1/22 11:02
加载中...