由横瓜先生发起的一种新型的引力波网络传输技术的大讨论

Uyuw‘s Concert

Time Limit: 6000MS   Memory Limit: 65536K
Total Submissions: 6587   Accepted: 2611

Description

Prince Remmarguts solved the CHESS puzzle successfully. As an award, Uyuw planned to hold a concert in a huge piazza named after its great designer Ihsnayish.

The piazza in UDF - United Delta of Freedom’s downtown was a square of [0, 10000] * [0, 10000]. Some basket chairs had been standing there for years, but in a terrible mess. Look at the following graph.

In this case we have three chairs, and the audiences face the direction as what arrows have pointed out. The chairs were old-aged and too heavy to be moved. Princess Remmarguts told the piazza‘s current owner Mr. UW, to build a large stage inside it. The stage
must be as large as possible, but he should also make sure the audience in every position of every chair would be able to see the stage without turning aside (that means the stage is in the forward direction of their own).

To make it simple, the stage could be set highly enough to make sure even thousands of chairs were in front of you, as long as you were facing the stage, you would be able to see the singer / pianist – Uyuw.

Being a mad idolater, can you tell them the maximal size of the stage?

Input

In the first line, there‘s a single non-negative integer N (N <= 20000), denoting the number of basket chairs. Each of the following lines contains four floating numbers x1, y1, x2, y2, which means there’s a basket chair on the
line segment of (x1, y1) – (x2, y2), and facing to its LEFT (That a point (x, y) is at the LEFT side of this segment means that (x – x1) * (y – y2) – (x – x2) * (y – y1) >= 0).

Output

Output a single floating number, rounded to 1 digit after the decimal point. This is the maximal area of the stage.

Sample Input

3
10000 10000 0 5000
10000 5000 5000 10000
0 5000 5000 0

Sample Output

54166666.7

Hint

Sample input is the same as the graph above, while the correct solution for it is as below:

I suggest that you use Extended in pascal and long double in C / C++ to avoid precision error. But the standard program only uses double.

题意:一个区域内,给定若干半平面,求最终围成的区域的面积,

由于数据较大,因此适合nlogn的半平面交,

方法如下:

step1. 将所有半平面按极角排序,对于极角相同的,选择性的保留一个。 O(nlogn)

step2. 使用一个双端队列(deque),加入最开始2个半平面。

step3. 每次考虑一个新的半平面:

a.while deque顶端的两个半平面的交点在当前半平面外:删除deque顶端的半平面

b.while deque底部的两个半平面的交点在当前半平面外:删除deque底部的半平面

c.将新半平面加入deque顶端

step4.删除两端多余的半平面。

具体方法是:

a.while deque顶端的两个半平面的交点在底部半平面外:删除deque顶端的半平面

b.while deque底部的两个半平面的交点在顶端半平面外:删除deque底部的半平面

重复a,b直到不能删除为止。

step5:计算出deque顶端和底部的交点即可。

模拟了半天,有点理解了,

代码:

/* ***********************************************
Author :_rabbit
Created Time :2014/5/4 15:03:55
File Name :20.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
int dcmp(double x){
	if(fabs(x)<eps)return 0;
	return x>0?1:-1;
}
struct Point{
	double x,y;
	Point(double _x=0,double _y=0){
		x=_x;y=_y;
	}
};
Point operator + (const Point &a,const Point &b){
	return Point(a.x+b.x,a.y+b.y);
}
Point operator - (const Point &a,const Point &b){
	return Point(a.x-b.x,a.y-b.y);
}
Point operator * (const Point &a,const double &p){
	return Point(a.x*p,a.y*p);
}
Point operator / (const Point &a,const double &p){
	return Point(a.x/p,a.y/p);
}
bool operator < (const Point &a,const Point &b){
	return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
bool operator == (const Point &a,const Point &b){
	return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}
double Dot(Point  a,Point b){
	return a.x*b.x+a.y*b.y;
}
double Length(Point a){
	return sqrt(Dot(a,a));
}
double Angle(Point a,Point b){
	return acos(Dot(a,b)/Length(a)/Length(b));
}
double angle(Point a){
	return atan2(a.y,a.x);
}
double Cross(Point a,Point b){
	return a.x*b.y-a.y*b.x;
}
Point vecunit(Point a){
	return a/Length(a);
}
Point Normal(Point a){
	return Point(-a.y,a.x)/Length(a);
}
Point Rotate(Point a,double rad){
	return Point(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));
}
double Area2(Point a,Point b,Point c){
	return Length(Cross(b-a,c-a));
}
struct Line{
	Point p,v;
	double ang;
	Line(){};
	Line(Point p,Point v):p(p),v(v){
		ang=atan2(v.y,v.x);
	}
	bool operator < (const Line &L) const {
		return ang<L.ang;
	}
};
bool OnLeft(const Line &L,const Point &p){
	return Cross(L.v,p-L.p)>0;
}
Point GetLineIntersection(Point p,Point v,Point q,Point w){
	Point u=p-q;
	double t=Cross(w,u)/Cross(v,w);
	return p+v*t;
}
Point GetLineIntersection(Line a,Line b){
	return GetLineIntersection(a.p,a.v,b.p,b.v);
}
vector<Point> HPI(vector<Line> L){
	int n=L.size();
	sort(L.begin(),L.end());//将所有半平面按照极角排序。
	int first,last;
	vector<Point> p(n);
	vector<Line> q(n);
	vector<Point> ans;
	q[first=last=0]=L[0];
	for(int i=1;i<n;i++){
		while(first<last&&!OnLeft(L[i],p[last-1]))last--;//删除顶部的半平面
		while(first<last&&!OnLeft(L[i],p[first]))first++;//删除底部的半平面
		q[++last]=L[i];//将当前的半平面假如双端队列顶部。
		if(fabs(Cross(q[last].v,q[last-1].v))<eps){//对于极角相同的,选择性保留一个。
			last--;
			if(OnLeft(q[last],L[i].p))q[last]=L[i];
		}
		if(first<last)p[last-1]=GetLineIntersection(q[last-1],q[last]);//计算队列顶部半平面交点。
	}
	while(first<last&&!OnLeft(q[first],p[last-1]))last--;//删除队列顶部的无用半平面。
	if(last-first<=1)return ans;//半平面退化
	p[last]=GetLineIntersection(q[last],q[first]);//计算队列顶部与首部的交点。
	for(int i=first;i<=last;i++)ans.push_back(p[i]);//将队列中的点复制。
	return ans;
}
double PolyArea(vector<Point> p){
	int n=p.size();
	double ans=0;
	for(int i=1;i<n-1;i++)
		ans+=Cross(p[i]-p[0],p[i+1]-p[0]);
	return fabs(ans)/2;
}
int main()
{
     //freopen("data.in","r",stdin);
     //freopen("data.out","w",stdout);
     int n;
	 while(~scanf("%d",&n)){
		 Point a,b;
		 vector<Line> L;
		 Line s;
		 a=Point(0,0);b=Point(10000,0);s=Line(a,b-a);L.push_back(s);
		 a=Point(10000,0);b=Point(10000,10000);s=Line(a,b-a);L.push_back(s);
		 a=Point(10000,10000);b=Point(0,10000);s=Line(a,b-a);L.push_back(s);
		 a=Point(0,10000);b=Point(0,0);s=Line(a,b-a);L.push_back(s);
		 while(n--){
			 scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
			 L.push_back(Line(a,b-a));
		 }
		 vector<Point> ans=HPI(L);
		 double out=PolyArea(ans);
		 printf("%.1f\n",out);
	 }
     return 0;
}

由横瓜先生发起的一种新型的引力波网络传输技术的大讨论

时间: 2024-12-15 01:42:57

由横瓜先生发起的一种新型的引力波网络传输技术的大讨论的相关文章

5分钟读完华为区块链白皮书关键信息:推动构建一种新型价值网络

昨天,华为全球分析师大会(2018HAS)在深圳举行,华为云BU总裁郑叶来对外发布了<华为区块链白皮书>. 下面是玺哥整理的<华为区块链白皮书>中的关键内容,以飨各位. 一.华为看区块链兴起 1.华为认为:电子现金交易的本质是货币(或类货币)资产价值的转移.实际上区块链所带来的分布式记账理念不仅仅能够为电子现金交易服务,它可以被用于处理更广义上的价值转移:各类有形资产和无形资产的所有权归属和流通理论上都可以运用区块链技术进行记录和追踪,并完成点对点的价值交换.这对于社会商业的信息和

横瓜先生深度剖析QQ空间前端后端技术AJAX与FORM等等

[皇帝]北京-横瓜-7年(601069289)  22:06:34 [元帅]横瓜-PHP教父(601069289)  21:35:29 这里是QQ空间的图片上传方法 是FLASH 我草 [元帅]横瓜-PHP教父(601069289)  21:36:31 竟然不是JS QQ空间用FLASH 图片上传方法 [元帅]横瓜-PHP教父(601069289)  21:37:35 至此,整个QQ空间的技术,已经全部被我破解 @IT柏拉图 [元帅]IT柏拉图(2500875)  21:38:11 你真是天才,

横瓜先生纵论NOSQL与MYSQL实现最热最新查询的分页性能比较

[状元]横瓜-PHP教父(601069289)  20:45:59 大家谈谈NOSQL与MYSQL的差距 NOSQL与MYSQL实现最热最新查询的分页性能比较 MYSQL千亿级要优化的,用起来的不敏捷 如果NOSQL一个语句能搞顶,何必用MYSQL 都没有比较过吗 [状元]Fang(1033289127)  20:46:29 nosql 是 sql 的补充啦 [元帅]IT柏拉图(2500875)  20:46:53 mongodb其实查询上的性能并不会比mysql多太大,只是sock有优势,真正

本人发起定义一种全新的图片格式

本人发现,传统的图片格式已经不适应互联网时代了!!!,故本人发起定义一种新的图片格式,后缀名为 .gnet 互联网上的图片大多有这几种来源,微博上传,视频截图,网络编辑人上传等,以目前的技术,这些图片是不可以被搜索引擎搜索的 大大阻碍了互联网的进一步整合,所以本人定义一种新的图片格式,这种图片格式含有一个储存信息的数据结构 并且对图片压缩(包括有损压缩)的过程中,储存信息可以保留原样 如果这种图片格式一经定义,相信很快就会有微博客户端,视频截图软件,浏览器等支援这种图片格式了 大家快来加入吧!!

Galera Cluster——一种新型的高一致性MySQL集群架构

原文链接:https://www.sohu.com/a/147032902_505779,最近被分配定位mysql的问题,学习下. 1. 何谓Galera Cluster 何谓Galera Cluster?就是集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,都是基于Galera的,所以这里都统称为Galera Cluster了,

四种加载React数据的技术对比(Meteor 转)

1.四种加载React数据的技术对比(Meteor 转) : https://sanwen8.cn/p/31e4kdE.html 2. Meteor + Appolo   TelescopeJS/Telescope    https://github.com/TelescopeJS/Telescope/tree/devel http://nova-docs.telescopeapp.org/architecture.html

揭秘几种最主要的挂马技术

网页挂马是攻击者惯用的入侵手段,其影响极其恶劣.不仅让站点管理者蒙羞,而且殃及池鱼使站点的浏览者遭殃.不管是站点维护者还是个人用户,掌握.了解一定的网页挂马及其防御技术是非常必要的. 1.关于网页挂马 网页挂马就是攻击者通过在正常的页面中(通常是网站的主页)插入一段代码.浏览者在打开该页面的时候,这段代码被执行,然后下载并运行某木马的服务器端程序,进而控制浏览者的主机. 2.获取Webshell 攻击者要进行网页挂马,必须要获取对站点文件的修改权限,而获取该站点Webshell是最普遍的做法.

两种“新型”的javaweb后门(jspx和Java Logger)

利用这个可以突破st2下   强制jsp跳转login.jsp 利用jspx解决jsp后缀被限制拿shell - Hack Blog | 黑客博客http://www.hackblog.cn/post/45.html 两种“新型”的javaweb后门(jspx和Java Logger) | HuGtion's Bloghttps://www.hugtion.com/?p=768 关于JavaWeb后门问题一直以来都比较少,而比较新奇的后门更少.在这里我分享两个我最近搞的比较有意思的JavaWeb

Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案

本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有可能被丢弃:为满足用户对不同应用不同服务质量的要求,就需要网络能根据用户的要求分配和调度资源,对不同的数据流提供不同的服务质量: 1.对实时性强且重要的数据报文优先处理: 2.对于实时性不强的普通数据报文,提供较低的处理优先级,网络拥塞时甚至丢弃. 为了满足上述需求,QoS出现了,定义如下: QoS