题目大意:

平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000

题解

我们看到了n的范围,于是我们就知道这一定不是一个线性算法

所以我们尝试枚举三角形的一个点,那么我们现在要对每一个点i,求

\(\sum_{j,k \neq i}(\overrightarrow{p_ip_j})*(\overrightarrow{p_ip_k})\)

其中*表示叉积

然后我们发现这是一个对二元对的某种操作求和的一种

我们可以想到将其转化为

\[\sum_{j,k \neq i}abs((\overrightarrow{p_ip_j})*\sum(\overrightarrow{p_ip_k}))
\]

我们拆开叉积的表达式即\(x_1*y_2 - y_1*x_2\)我们发现是可以这么拆的

但是我们每次累加的时候实际上是取abs的,所以实际上并不能这么加

所以我们尝试拆开abs

我们发现只要我们用一个恰当的顺序枚举j,k就可以不用取abs即可

所以可以做到\(O(n^2logn)\)瓶颈在于极角排序

  1. #include <cstdio>
  2. #include <iomanip>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef long long ll;
  8. template<typename T>inline void read(T &x){
  9. x=0;char ch;bool flag = false;
  10. while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
  11. while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
  12. }
  13. inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
  14. inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
  15. const int maxn = 3010;
  16. const double eps = 1e-9;
  17. struct Point{
  18. ll x,y;
  19. double k;
  20. Point(const ll &a=0,const ll &b=0){x=a;y=b;}
  21. };
  22. inline bool cmp1(const Point &a,const Point &b){
  23. return a.x == b.x ? a.y < b.y : a.x < b.x;
  24. }
  25. inline bool cmp2(const Point &a,const Point &b){
  26. return a.k < b.k;
  27. }
  28. typedef Point Vector;
  29. inline Vector operator + (const Vector &a,const Vector &b){
  30. return Vector(a.x + b.x,a.y + b.y);
  31. }
  32. inline Vector operator - (const Vector &a,const Vector &b){
  33. return Vector(a.x - b.x,a.y - b.y);
  34. }
  35. inline ll cross(const Vector &a,const Vector &b){
  36. return a.x*b.y - a.y*b.x;
  37. }
  38. Point s[maxn],p[maxn];
  39. int cnt = 0;
  40. int main(){
  41. int n;read(n);
  42. for(int i=1;i<=n;++i){
  43. read(p[i].x);read(p[i].y);
  44. }sort(p+1,p+n+1,cmp1);
  45. ll ans = 0;
  46. for(int i=1;i<=n;++i){
  47. cnt = 0;
  48. for(int j=i+1;j<=n;++j){
  49. s[++cnt] = p[j] - p[i];
  50. if(p[j].x == p[i].x) s[cnt].k = 1e10;
  51. else s[cnt].k = (double)(p[i].y - p[j].y)/(double)(p[i].x - p[j].x);
  52. }sort(s+1,s+cnt+1,cmp2);
  53. Point sum;
  54. for(int j=cnt;j>=1;--j){
  55. ans += cross(s[j],sum);
  56. sum = sum + s[j];
  57. }
  58. }printf("%lld.",ans>>1);
  59. if(ans & 1) puts("5");
  60. else puts("0");
  61. getchar();getchar();
  62. return 0;
  63. }

并且在做题的时候发现了一些有趣的事情

  1. long long x = 100000000000000;
  2. printf("%d\n",((long long)((double)x)) == x);

会输出0哈哈哈哈哈哈哈哈哈哈哈哈

为了这个lz拍了30mins的标程。。。

bzoj 1132: [POI2008]Tro 计算几何的更多相关文章

  1. bzoj 1132 [POI2008]Tro 几何

    [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1796  Solved: 604[Submit][Status][Discu ...

  2. BZOJ.1132.[POI2008]Tro(极角排序)

    BZOJ 洛谷 考虑暴力,每次枚举三个点,答案就是\(\frac12\sum_{k<j<i}(i-k)\times(j-k)\). 注意到叉积有分配率,所以固定\(k\),枚举\(i,j\ ...

  3. BZOJ 1132 [POI2008]Tro(极角排序)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1132 [题目大意] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和(N&l ...

  4. bzoj 1132 POI2008 Tro

    大水题=_=,可我想复杂了…… 很裸的暴力,就是加了个小优化…… 叉积求面积 :abs(xi*yj - yi*xj) 所以去掉绝对值,把 xi 和 xj 提出来就可以求和了 去绝对值加个极角排序,每次 ...

  5. 【刷题】BZOJ 1132 [POI2008]Tro

    Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...

  6. bzoj1132[POI2008]Tro 计算几何

    1132: [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1722  Solved: 575[Submit][Status] ...

  7. 【BZOJ】1132: [POI2008]Tro

    题意 给\(n(1 \le n \le 3000)\)个点,求所有三角形的面积和. 分析 首先枚举一个点,发现把其它点按照关于这个点的极角排序后第\(i\)个点关于前面\(1\)到\(i-1\)的点组 ...

  8. 【bzoj1132】[POI2008]Tro 计算几何

    题目描述 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 输入 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10000] 输出 保留 ...

  9. BZOJ1132: [POI2008]Tro

    1132: [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 815  Solved: 211[Submit][Status] ...

随机推荐

  1. local variable 'xxx' referenced before assignment(犯过同样的错)

    这个问题很囧,在外面定义了一个变量 xxx ,然后在Python的一个函数里面引用这个变量,并改变它的值,结果报错local variable 'xxx' referenced before assi ...

  2. yii2.0 console执行php守护进程

    //该方法只需执行一次public function actionIndex(){ $pid =pcntl_fork();//在当前进程中生成一个新的子进程 //$pid会有三种形式 $pid==-1 ...

  3. Java获取字符串的CRC8校验码(由C程序的代码修改为了Java代码)

    CRC8算法请百度,我也不懂,这里只是把自己运行成功的结构贴出来了.方法CRC8_Tab这里没有处理,因为我的程序中没有用到. package com.crc; public class CCRC8_ ...

  4. Aeroplane chess(简单概率dp)

    Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz start ...

  5. spring boot ajax post 前后端

    1 传输的数据格式是json 1.1 前端ajax json的所有的key都必须是双引号引用的,并且最外层也要用双引号引用.例如 "{"a":b, "b&quo ...

  6. LeetCode:零钱兑换【322】【DP】

    LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...

  7. 一张图学习vim常用命令

    一张图学习vim常用命令

  8. php......房屋租赁练习

    多条件查询搜索页面,提交到当前页面处理 <?php include("../DB.class.php"); $db = new DB(); /*var_dump($_POST ...

  9. 动态创建selectjs 操作select和option

    1.动态创建select function createSelect(){ var mySelect = document.createElement("select"); myS ...

  10. finally return 执行关系 异常处理 c#

    Return.finally执行关系简述 除了函数出现system.exit(0)终止虚拟机,finally中的代码一定执行,return语句会等待finally的执行:如果是值传递,finally中 ...