D - Acute Triangles

思路:

极角排序+点积叉积

在一个三角形中,如果它是直角或者顿角三角形,那么直角和顿角只会出现一次

所以直角和顿角三角形的个数等于直角和顿角的个数

所以锐角三角形的个数等于三元组个数减去直角和顿角的个数

三点共线看成退化的顿角三角形

怎么算直角和顿角个数呢, 先按某个点极角排序,然后暴力过取,用双指针维护到

当前幅角距离为pi/2 到 3*pi/2 的区间, 区间内点的个数就是到当前幅角为直角或顿角的个数

可以用点积和叉积分别判断角度和相对方向

代码:

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #pragma GCC optimize(4)
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6. #define fi first
  7. #define se second
  8. #define pi acos(-(long double)1.0)
  9. #define LL long long
  10. //#define mp make_pair
  11. #define pb push_back
  12. #define ls rt<<1, l, m
  13. #define rs rt<<1|1, m+1, r
  14. #define ULL unsigned LL
  15. #define pll pair<LL, LL>
  16. #define pli pair<LL, int>
  17. #define pii pair<int, int>
  18. #define piii pair<pii, int>
  19. #define pdd pair<long double, long double>
  20. #define mem(a, b) memset(a, b, sizeof(a))
  21. #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  22. #define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
  23. //head
  24.  
  25. const int N = 2e3 + ;
  26. struct point {
  27. LL x, y;
  28. point(){}
  29. point(LL x, LL y):x(x), y(y){}
  30. LL dot(point p) {
  31. return x*p.x + y*p.y;
  32. }
  33. LL cross(point p) {
  34. return x*p.y - y*p.x;
  35. }
  36. }p[N], t[N];
  37. bool anglecmp(point a, point b) {
  38. if(a.y <= && b.y > ) return true;
  39. if(a.y > && b.y <= ) return false;
  40. if(!a.y && !b.y) return a.x < b.x;
  41. return a.cross(b) > ;
  42. }
  43. bool acute(point a, point b) {
  44. return a.dot(b) > && a.cross(b) >= ;
  45. }
  46. bool acute2(point a, point b) {
  47. return a.dot(b) > && a.cross(b) < ;
  48. }
  49. int main() {
  50. int T, n;
  51. scanf("%d", &T);
  52. while(T--) {
  53. scanf("%d", &n);
  54. for (int i = ; i <= n; i++) scanf("%lld %lld", &p[i].x, &p[i].y);
  55. LL ans = 1LL*n*(n-)*(n-)/;
  56. for (int i = ; i <= n; i++) {
  57. int cnt = ;
  58. for (int j = ; j <= n; j++) {
  59. if(j!=i)
  60. t[++cnt] = point(p[j].x - p[i].x, p[j].y - p[i].y);
  61. }
  62. sort(t+, t++cnt, anglecmp);
  63. int l = , r = ;
  64. for (int j = ; j <= cnt; j++) {
  65. while(l <= cnt && acute(t[j], t[l])) l++;
  66. while(r <= cnt && !acute2(t[j], t[r])) r++;
  67. ans -= r-l;
  68. }
  69. }
  70. printf("%lld\n", ans);
  71. }
  72. return ;
  73. }

2017 Russian Code Cup (RCC 17), Elimination Round D - Acute Triangles的更多相关文章

  1. 2017 Russian Code Cup (RCC 17), Final Round

    2017 Russian Code Cup (RCC 17), Final Round A Set Theory 思路:原题转换一下就是找一个b数组,使得b数组任意两个数的差值都和a数组任意两个数的差 ...

  2. 2016 Russian Code Cup (RCC 16), Final Round B - Cactusophobia

    B - Cactusophobia 思路: 点双联通分量+最大流 用tarjan求出每个点双联通分量 对于大小大于1的点双联通分量,它就是个环,那么源点和这个环相连, 容量为环的大小减一,这个环和环上 ...

  3. [Russian Code Cup 2017 - Finals [Unofficial Mirror]]简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. Div1难度+ACM赛制  和几个大佬组队逛了逛 A.给一个大小为n的集合ai(1<=ai<=1000000),要求你构造一个大小 ...

  4. 【CF1146】Forethought Future Cup - Elimination Round

    Forethought Future Cup - Elimination Round 窝也不知道这是个啥比赛QwQ A. Love "A" 给你一个串,你可以删去若干个元素,使得最 ...

  5. CF1146 Forethought Future Cup Elimination Round Tutorial

    CF1146 Forethought Future Cup Elimination Round Tutorial 叮,守夜冠军卡 https://codeforces.com/blog/entry/6 ...

  6. Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)

    Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) #include <bits/stdc++ ...

  7. Google Code Jam Africa 2010 Qualification Round Problem B. Reverse Words

    Google Code Jam Africa 2010 Qualification Round Problem B. Reverse Words https://code.google.com/cod ...

  8. IntelliJ IDEA 2017.3.5 安装 lombok-plugin-0.17 失败,通过网络下载总是超时

    1.问题: IntelliJ IDEA 2017.3.5 安装 lombok-plugin-0.17 失败,通过网络下载总是超时: 2.原因:IntelliJ IDEA 2017.3.5 目前还不支持 ...

  9. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)

    A - Forgetting Things 题意:给 \(a,b\) 两个数字的开头数字(1~9),求使得等式 \(a=b-1\) 成立的一组 \(a,b\) ,无解输出-1. 题解:很显然只有 \( ...

随机推荐

  1. bat杂记 cmd

    强制复制覆盖 copy f:\temp1.txt f:\temp2.txt /y 删除 del f:\temp1.txt 删除任务aa1 schtasks /Delete /TN aa1 /F cmd ...

  2. 如何查看.net framework 版本

    以windows 2016 standard版本为例 通过注册表查看,找到 .NET Framework 注册表信息所在的位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsof ...

  3. 10大必备的Intellij插件,大幅提高你的工作效率

    转自: https://blog.csdn.net/qq1404510094/article/details/80379375 1. .ignore 生成各种ignore文件,一键创建git igno ...

  4. ELK基础原理

    搜索引擎 索引组件:  获取数据-->建立文档-->文档分析-->文档索引(倒排索引)    搜索组件:  用户搜索接口-->建立查询(将用户键入的信息转换为可处理的查询对象) ...

  5. python基础之 编码进阶,文件操作和深浅copy

    1.编码的进阶 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码.即先将其他编码的字符串解码(decode)成unicode,再从unic ...

  6. pycharm中代码整体缩进

    整体缩进 :  1.选中需要缩进的代码 2.Tab键 反向缩进:  shift+Tab

  7. 关于绕过域名(ip)校验的一些小知识

    这篇文章最开始只是想写一个关于绕过referer的方法,写着写着发现和ssrf以及url跳转的一些手法类似,于是把这两种也加上了 对referer做校验一般是对csrf进行防范的手段之一,但是很多时候 ...

  8. Go 初体验 - 令人惊叹的语法 - defer.4 - defer 对宿主函数返回值的影响

    defer 函数可以影响宿主函数的返回值 看代码: 调用: 输出: 结果又让人意外了. coo1:因为传引用,return 时 i = 100, return 返回的也是 100,return 执行之 ...

  9. ORA-00907: 缺失右括号,原因及解决办法整理

    ORA-00907: 缺失右括号,原因及解决办法整理 1 union all中order by 导致缺失右括号 在有union all的子查询中使用了order by,会导致缺失右括号的错误,事实上在 ...

  10. CFRunLoop 源码学习笔记(CF-1151.16)

    1.CFRunLoopModeRef 什么时候创建的? 在调用__CFRunLoopFindMode(rl, modeName, create) 1.1)首先通过modeName 在RunLoop 中 ...