SPOJ UMR 10A 计算几何

DES:顺时针给出构成凸多边形的点。然后有Q个询问任意给出两个点的编号,询问由这两个点的连线将多边形分成的两部分面积较小的部分面积大小。

比赛时直接每次连线后求多边形求面积超时了。正确解法是求出利用叉积球三角形面积不断求和求出多边形总面积的同时,保留多边形的前缀和。当任意两点连线时,只要用前缀和想减再减去一个三角形的面积即可。

然而...我不理解的是关于q的那个循环...for就是超时...while就是AC...坐标明明是interger...int就WA...double就AC...

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
using namespace std;

struct Point
{
    double x, y;
} p[50010];

double areaa(Point p0, Point p1, Point p2)  //计算以这三个点为顶点的三角形面积
{
    double temp = (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
    temp /= 2.0;
    return fabs(temp);
}

double area[50010];  // 存储多边形的前缀多边形的面积。

int main()
{
    int n, q;
    int xx, yy;
    while(~scanf("%d%d", &n, &q))
    {
        for (int i=0; i<n; ++i)
        {
            scanf("%lf%lf", &p[i].x, &p[i].y);
        }
        double tot_area = 0;
        area[0] = 0;
        area[1] = 0;
        for (int i=1; i<n-1; ++i)
        {
            tot_area += areaa(p[0], p[i], p[i+1]);
            area[i+1] = tot_area;
        }
        int t1, t2;
        double ans;
        double temp_area;

        while(q--)
        {
            scanf("%d%d", &t1, &t2);
            if (t2 > t1) swap(t1, t2);  // 保证t1>t2
            temp_area = area[t1]-area[t2]-areaa(p[0], p[t1], p[t2]);
            if (temp_area < tot_area-temp_area)
                printf("%.1lf\n", temp_area);
            else printf("%.1lf\n", tot_area-temp_area);
        }
    }
    return 0;
}

L哦哦K

时间: 2024-10-19 11:15:57

SPOJ UMR 10A 计算几何的相关文章

SPOJ AMR10A Playground(计算几何)

Playground Time limit: 2s Source limit: 50000B Memory limit: 256MB My kid's school cleared a large field on their property recently to convert it into a playing area.  The field is polygonal.  The school administration decided to separate the field i

SPOJ CIRU The area of the union of circles (计算几何)

题意:求 m 个圆的并的面积. 析:就是一个板子题,还有要注意圆的半径为0的情况. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstrin

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

原文地址: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

计算几何题目分类

转载 一.基础题目 1.1 有固定算法的题目 A, 最近点对问题最近点对问题的算法基于扫描线算法.ZOJ 2107    Quoit Design    典型最近点对问题POJ    3714    Raid    变种最近点对问题 B,最小包围圆最小包围圆的算法是一种增量算法,期望是O(n).ZOJ    1450    Minimal Circle  HDU    3007    Buried memory C,旋转卡壳POJ 3608    Bridge Across Islands   

SPOJ 705 Distinct Substrings(后缀数组)

[题目链接] http://www.spoj.com/problems/SUBST1/ [题目大意] 给出一个串,求出不相同的子串的个数. [题解] 对原串做一遍后缀数组,按照后缀的名次进行遍历, 每个后缀对答案的贡献为n-sa[i]+1-h[i], 因为排名相邻的后缀一定是公共前缀最长的, 那么就可以有效地通过LCP去除重复计算的子串. [代码] #include <cstdio> #include <cstring> #include <algorithm> usi

SPOJ 3273

传送门: 这是一道treap的模板题,不要问我为什么一直在写模板题 依旧只放代码 1 //SPOJ 3273 2 //by Cydiater 3 //2016.8.31 4 #include <iostream> 5 #include <cstring> 6 #include <ctime> 7 #include <cmath> 8 #include <cstdlib> 9 #include <string> 10 #include

!HDU 4380 三角屋内有奇数个宝藏的三角形有多少个-计算几何-(向量叉乘&amp;线段与点的关系&amp;暴力枚举)

题意:小明要买三座房子,这三个房子构成一个三角形,已知n个房子的坐标,任何三个房子都不在一条直线上,又已知有m个宝藏的坐标,问房子构成的三角形内有奇数个宝藏的三角形有多少个.数据范围:n(3~100),m(1~1000) 分析: 简单的计算几何.记住这题的做法. 三角形内的点的个数=上面的线段下面的点的个数 -- 下面两条线段下面的点的个数(或者下面一条线段减上面两条线段,看具体位置情况,所以直接取绝对值就好) n个点有n(n-1)/2条线段,不超过1W,枚举每条线段,再枚举每个宝藏的坐标(10

Opengl绘制计算几何库CGAL三角剖分结果的Demo

Ubuntu下改编了一个用CGAL计算输入点的三角剖分,并用OpenGL显示结果的C++程序. 该Demo可作为一个计算几何及绘图的框架. 代码如下: //编译命令:g++ spatial_sort.cpp -lglut -lGL -lGLU -lCGAL -lCGAL_Core -lgmp #include <CGAL/Exact_predicates_inexact_constructions_kernel.h>   #include <CGAL/Triangulation_eucl

Ubuntu下安装cgal4.5.2计算几何库

摘要:cgal是一个开源的计算几何库, 博文记录了其编译.安装和使用方法. 1 库下载 站点:http://www.cgal.org/ 下载:https://gforge.inria.fr/frs/download.php/file/34514/CGAL-4.5.2.zip 2 解压缩.编译与安装 shell下进入解压文件夹 1)库配置文件生成命令: cmake . 提示缺少gmp和mpfr库 安装缺少的库: sudo apt-get install libgmp-dev libmpfr-dev