[poj2451]Uyuw's Concert

半平面交滴裸题,但是要求nlogn,练练手

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MN 50000
#define eps 1e-17
#define ld long double
using namespace std;
inline int read()
{
    int x = 0 , f = 1; char ch = getchar();
    while(ch < ‘0‘ || ch > ‘9‘){ if(ch == ‘-‘) f = -1;  ch = getchar();}
    while(ch >= ‘0‘ && ch <= ‘9‘){x = x * 10 + ch - ‘0‘;ch = getchar();}
    return x * f;
}

struct P
{
    ld x,y;
    P(ld _x=0,ld _y=0):x(_x),y(_y){}
    P operator +(P b){return P(x+b.x,y+b.y);}
    P operator -(P b){return P(x-b.x,y-b.y);}
    P operator *(ld b){return P(x*b,y*b);}
    ld operator^(P b){return x*b.y-b.x*y;}
}p[MN+5];
struct L
{
    P p,v;ld slop;
    L(){}
    L(P x,P y):p(x),v(y){slop=atan2(y.y,y.x);}
    P operator *(L y){P b=p-y.p;ld t=(y.v^b)/(v^y.v);return p+v*t;}
    bool operator <(const L&y)const{return slop<y.slop;}
    bool left(P y){return (v^(y-p))>eps;}
}q[MN+5],s[MN+5];
int n,top,tail;

void solve()
{
    q[top=tail=1]=s[1];
    for(int i=2;i<=n;i++)
    {
        while(top>tail&&!s[i].left(p[top])) --top;
        while(top>tail&&!s[i].left(p[tail+1])) ++tail;
        if(fabs(s[i].slop-q[top].slop)<eps)
            q[top]=s[i].left(q[top].p)?q[top]:s[i];
        else
            q[++top]=s[i];
        p[top]=q[top]*q[top-1];
    }
    while(top>tail&&!q[tail].left(p[top])) --top;
}

int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        double x,y,x2,y2;scanf("%lf%lf%lf%lf",&x,&y,&x2,&y2);
        s[i]=L(P(x,y),P(x2-x,y2-y));
    }
    s[++n]=L(P(0,0),P(10000,0));
    s[++n]=L(P(10000,0),P(0,10000));
    s[++n]=L(P(10000,10000),P(-10000,0));
    s[++n]=L(P(0,10000),P(0,-10000));
    sort(s+1,s+n+1);
    solve();p[tail]=q[top]*q[tail];
    if(top-tail<2) return 0*puts("0.0");
    ld ans=p[top]^p[tail];
    for(int i=tail;i<top;i++) ans+=p[i]^p[i+1];
    printf("%.1lf\n",(double)fabs(ans)/2.0);
    return 0;
}

[poj2451]Uyuw's Concert

时间: 2024-10-11 09:30:40

[poj2451]Uyuw's Concert的相关文章

POJ2451 Uyuw&#39;s Concert (半平面交)

POJ2451  给定N个半平面 求他们的交的面积. N<=20000 首先参考 POJ1279 多边形的核 其实就是这里要求的半平面交 但是POJ1279数据较小 O(n^2)的算法 看起来是要TLE的 但是试着提交了一下 一遍就A了... 看来暴力的半平面切割法实际表现远远好于O(n^2) 如果数据再大一点呢? N=100000? 有一个办法可以优化到O(nlogn) step1. 将所有半平面按极角排序,对于极角相同的,选择性的保留一个. O(nlogn) step2. 使用一个双端队列(

poj 2451 Uyuw&#39;s Concert(半平面交)

Uyuw's Concert Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8580   Accepted: 3227 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 d

POJ 2451 Uyuw&#39;s Concert(半平面交nlgn)

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <cstring> #include <cmath> #include <stack> #include <queue> #include <vector> #include <

POJ 2451 Uyuw&#39;s Concert

学了ZZY的算法,就要过一下他出的题. 题目大意: 给出一些直线,求半平面交的面积. 解题思路: 半平面交求面积. 下面是代码: #include <set> #include <map> #include <queue> #include <math.h> #include <vector> #include <string> #include <stdio.h> #include <string.h> #i

【转】计算几何题目推荐

打算转下来好好做计算几何了. 原文地址:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行

【转】[专题学习][计算几何]

原文地址:http://www.cnblogs.com/ch3656468/archive/2011/03/02/1969303.html 基本的叉积.点积和凸包等东西就不多说什么了,网上一搜一大堆,切一些题目基本熟悉了就差不多了. 一些基本的题目可以自己搜索,比如这个blog:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 接下来,研究了半平面交,思想方法看07年朱泽园的国家队论文,模板代码参考自我校大牛韬哥: http://www.o

[转] POJ几何分类

转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板.如果代码一片混乱,那么会严重影响做题正确率.4.注意精度控制.5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2).因为整数不用考虑浮点误差,而且运算比浮点快. 一.点

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

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 d

半平面交总结and模板

博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40859973 这两天刷了POJ上几道半平面交,对半平面交有了初步的体会,感觉半平面交还是个挺实用的知识点. 半平面交主要是看的ZZY的国家队论文,他提出的是一种O(n×log(n))的排序增量法. 附论文地址: 算法合集之<半平面交的新算法及其实用价值>. POJ 3335 Rotating Scoreboard 题目大意: World finals 要开始了,比赛场地是一