当前位置: 首页 > news >正文

LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)

题面

传送门

题解

我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线

那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算

怎么优化呢?我们可以枚举一个定点,然后把其它所有点按到这个定点的极角排序,那么就可以\(O(n^2)\)得出答案了

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
    R int res,f=1;R char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
const int N=3005;const double Pi=acos(-1.0);
int c[2][5],bl[N],n;ll res;
struct node{
    int x,y,c;double k;
    inline node(){}
    inline node(R int xx,R int yy):x(xx),y(yy){}
    inline node operator -(const node &b)const{return node(x-b.x,y-b.y);}
    inline double K(){return atan2(y,x);}
    inline bool operator <(const node &b)const{return k<b.k;}
}st[N],p[N];
inline int calc(R int k,R int x){
    switch(x){
        case 0:return c[k][1]*c[k][2];break;
        case 1:return c[k][0]*c[k][2];break;
        case 2:return c[k][0]*c[k][1];break;
    }
}
void solve(int id){
    int top=0;
    fp(i,1,id-1)p[++top]=st[i],p[top].k=(st[i]-st[id]).K();
    fp(i,id+1,n)p[++top]=st[i],p[top].k=(st[i]-st[id]).K();
    fp(i,1,top)if(p[i].k<=0)p[i].k+=Pi;
    sort(p+1,p+1+top);
    c[0][0]=c[0][1]=c[0][2]=c[1][0]=c[1][1]=c[1][2]=0;
    fp(i,1,top)if(p[i].y<st[id].y||p[i].y==st[id].y&&p[i].x>st[id].x)
        ++c[0][p[i].c],bl[i]=0;
    else ++c[1][p[i].c],bl[i]=1;
    fp(i,1,top){
        --c[bl[i]][p[i].c],res+=1ll*calc(0,st[id].c)*calc(1,p[i].c);
        res+=1ll*calc(1,st[id].c)*calc(0,p[i].c),bl[i]^=1,++c[bl[i]][p[i].c];
    }
}
int main(){
//  freopen("testdata.in","r",stdin);
    n=read();
    fp(i,1,n)st[i].x=read(),st[i].y=read(),st[i].c=read();
    fp(i,1,n)solve(i);
    printf("%lld\n",res>>2);
    return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10706830.html

相关文章:

  • 软件实现
  • tcp的三次握手
  • 怎样提高个人素质与修养
  • echarts、higncharts折线图或柱状图显示数据为0的点
  • iOS开发的一些奇巧淫技3
  • Spring Cloud OAuth 实现微服务内部Token传递的源码解析
  • Swift实现菜单的多选
  • 预防缓存击穿-布隆过滤器
  • Windows下PyQt4的安装
  • jsplumb 使用总结
  • PHP判断变量是否存在及函数isset() 、empty()与is_null的区别
  • [mysql]错误解决之Failed to start MySQL Server
  • CSS3 calc的用法详解
  • MySQL主从复制虽好,能完美解决数据库单点问题吗?
  • 声明25个长度的数组,通过键盘录入学生成绩,并把每个元素赋值为学生的分数成绩,输出结束后遍历输出。...
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • ES6 学习笔记(一)let,const和解构赋值
  • ES6--对象的扩展
  • GraphQL学习过程应该是这样的
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JAVA SE 6 GC调优笔记
  • MD5加密原理解析及OC版原理实现
  • Protobuf3语言指南
  • React的组件模式
  • REST架构的思考
  • Vue2.x学习三:事件处理生命周期钩子
  • windows-nginx-https-本地配置
  • Xmanager 远程桌面 CentOS 7
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 产品三维模型在线预览
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 一份游戏开发学习路线
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • (1)(1.13) SiK无线电高级配置(五)
  • (HAL库版)freeRTOS移植STMF103
  • (超详细)语音信号处理之特征提取
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • ***原理与防范
  • .htaccess 强制https 单独排除某个目录
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core引入性能分析引导优化
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net下简单快捷的数值高低位切换
  • @Autowired 与@Resource的区别
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [4.9福建四校联考]
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BUUCTF 2018]Online Tool
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn