⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3945948_tle.cpp

📁 北大大牛代码 1240道题的原代码 超级权威
💻 CPP
字号:
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

double hx1, hx2, hy;
double px1, px2, py;

struct point
{
	double x, y;
	point(double _x, double _y) : x (_x), y (_y) {}
};



struct line
{
	double a, b, c;
};

struct segment
{
	double l, r;
	segment(double _l, double _r) : l (_l), r (_r) {}

	bool operator < (const segment &s)	const
	{
		if (l != s.l)
			return l < s.l;
		return r < s.r;
	}
};

vector <segment> p;

line LineFromSeg(point a,point b)
{
	line l;
	
	l.a = b.y - a.y;
	l.b = a.x - b.x;
	l.c = b.x * a.y - a.x * b.y;
	return l;
}

double get(point a, point b)
{
	line l = LineFromSeg(a, b);
	return -(l.c + l.b * py) / l.a;
}

int main()
{
	int i, j, n;
	double x1, x2, y;
	double last;
	double max;

	while (true)
	{
		scanf("%lf%lf%lf", &hx1, &hx2, &hy);
		p.clear();
		if (hx1 == 0 && hx2 == 0 && hy == 0)
		{
			break;
		}
		point a (hx1, hy);
		point b (hx2, hy);
		scanf("%lf%lf%lf", &px1, &px2, &py);
		scanf("%d", &n);
		for (i = 0; i < n; i++)
		{
			scanf("%lf%lf%lf", &x1, &x2, &y);
			p.push_back(segment(get(point(x1, y), b), get(point(x2, y), a)));
		}
		sort(p.begin(), p.end());
		last = px1;
		max = -1;
		for (i = 0; i < p.size(); i++)
		{
			j = i;
			if (p[i].l - last > max)
				max = p[i].l - last;
			while (j < p.size() && p[j].l <= p[i].r)
			{
				if (p[j].r > last)
					last = p[j].r;
				j++;
			}
			i = j - 1;
		}
		if (px2 - last > max)
			max = px2 - last;
		if (max <= 0)
			printf("No View\n");
		else
			printf("%.2lf\n", max);
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -