Description

小Q是个程序员。众所周知,程序员在写程序的时候经常需要草稿纸。小Q现在需要一张草稿纸用来画图,但是桌上
只有一张草稿纸,而且是一张被用过很多次的草稿纸。草稿纸可以看作一个二维平面,小Q甚至已经给它建立了直
角坐标系。以前每一次草稿使用过的区域,都可以近似的看作一个平面上的一个三角形,这个三角形区域的内部和
边界都不能再使用。当然了,以前的草稿也没有出现区域重叠的情况。小Q已经在草稿纸上画上了一些关键点,这
些关键点都在没使用过的区域。小Q想把这些关键点两两之间尽可能的用线段连接起来。连接两个关键点的线段有
可能会穿过已经用过的草稿区域,这样显然不允许。于是小Q就想知道,有多少对关键点可以被线段连接起来,而
且还不会穿过已经用过的区域。为了方便,小Q保证任意三个关键点不会共线。

Input

第一行包含两个整数V,T,表示草稿纸上的关键点数量和三角形区域数量。
接下来V行,每行两个整数x,y,表示一个关键点的坐标(x,y)。
接下来T行,每行六个整数x1,y1,x2,y2,x3,y3,表示一个三角形区域的三个顶点坐标分别是(x1,y1),(x2,y2),(x3,y
3)保证三角形的面积大于0。
V<=1000,T<=1000,0<=所有坐标<=10^8且为整数

Output

输出一行,一个整数,表示能够被线段连接起来的关键点有多少对。

对每个点以它为中心进行扫描线,处理在右方的点和三角形。

#include<bits/stdc++.h>
typedef long long i64;
typedef double ld;
int n,m;
int sgn(i64 x){return x<?-:x>;}
struct pos{
int x,y;
void R(){scanf("%d%d",&x,&y);}
i64 pw2(){return i64(x)*x+i64(y)*y;}
}ps[],ws[],trs[][],O=(pos){,},now;
pos operator-(const pos&a,const pos&b){return (pos){a.x-b.x,a.y-b.y};}
int operator*(const pos&a,const pos&b){return sgn(i64(a.x)*b.y-i64(a.y)*b.x);}
ld mul(const pos&a,const pos&b){return ld(a.x)*b.y-ld(a.y)*b.x;}
bool cmp(const pos&a,const pos&b){return a.x!=b.x?a.x<b.x:a.y<b.y;}
bool operator<(const pos&a,const pos&b){return a*b<;}
struct seg{
pos a[];
ld val()const{return mul(a[],a[])/mul(now,a[]-a[]);}
bool operator<(const seg&w)const{return val()<w.val();}
};
std::set<seg>st;
std::set<seg>::iterator its[];
struct Q{
pos a[];
int t,id;
bool operator<(const Q&w)const{
int x=a[t]*w.a[w.t];
return x?x<:t<w.t;
}
bool operator<(const pos&w){
int x=a[t]*w;
return x?x<:!t;
}
void cal(){
now=a[t];
if(cmp(now,O))now=(pos){,};
if(t)st.erase(its[id]);
else{
seg s=(seg){a[],a[]};
its[id]=st.insert(s).first;
}
}
}qs[];
bool cross(pos a,pos b1,pos b2){
pos ba=b2-a;
if((a*(b1-a))*(a*ba)>)return ;
pos b3=b1-b2;
return (b3*b2)*(b3*ba)<=;
}
int ans=,wp,qp,ip;
void scl(){
for(int i=,j=;i<wp;++i){
for(;j<qp&&qs[j]<ws[i];qs[j++].cal());
if(st.empty()||!cross(ws[i],st.begin()->a[],st.begin()->a[]))++ans;
}
}
void aq(pos a,pos b){
bool da=cmp(O,a),db=cmp(O,b);
++ip;
if(da)qs[qp++]=(Q){a,b,,ip};
else if(db)((Q){a,b,,ip}).cal();
if(db)qs[qp++]=(Q){a,b,,ip};
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)ps[i].R();
std::sort(ps+,ps+n+,cmp);
for(int i=;i<=m;++i)for(int j=;j<;++j)trs[i][j].R();
for(int i=;i<=n;++i){
st.clear();
wp=,qp=,ip=;
for(int j=i+;j<=n;++j)ws[wp++]=ps[j]-ps[i];
std::sort(ws,ws+wp);
for(int j=;j<=m;++j){
pos tr[];
for(int t=;t<;++t)tr[t]=trs[j][t]-ps[i];
std::sort(tr,tr+);
aq(tr[],tr[]);
}
std::sort(qs,qs+qp);
scl();
}
printf("%d\n",ans);
return ;
}

bzoj4814: [Cqoi2017]小Q的草稿的更多相关文章

  1. BZOJ 4814 Luogu P3699 [CQOI2017]小Q的草稿 (计算几何、扫描线、set)

    题目链接 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id=4814 (Luogu) https://www.luogu.org/problem/P ...

  2. bzoj 4814: [Cqoi2017]小Q的草稿【计算几何】

    //先打个50暴力,10min50分简直美滋滋~ #include<iostream> #include<cstdio> #include<algorithm> u ...

  3. bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]

    4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ...

  4. bzoj 4815: [Cqoi2017]小Q的表格 [数论]

    4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...

  5. BZOJ_4813_[Cqoi2017]小Q的棋盘_dfs

    BZOJ_4813_[Cqoi2017]小Q的棋盘_dfs Description 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能 在有连线的格 ...

  6. 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)

    [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...

  7. 洛咕 P3700 [CQOI2017]小Q的表格

    洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...

  8. 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告

    P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...

  9. [BZOJ4813][CQOI2017]小Q的棋盘(DP,贪心)

    4813: [Cqoi2017]小Q的棋盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 804  Solved: 441[Submit][Statu ...

随机推荐

  1. Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)

    B .Counting Inversion 题意:给定L,R,求这个区间的逆序对数之和.(L,R<1e15) 思路:一看这个范围就知道是数位DP. 只是维护的东西稍微多一点,需要记录后面的各种数 ...

  2. PAT-7-14 电话聊天狂人

    ps: 真不明白为什么水题不能一次ac 7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条 ...

  3. JavaScript面试知识点与开发技巧汇总

    1.bind相关用法 fun.bind(obj)将obj传入fun作为其作用域 fun.bind将返回一个新的函数地址,fun.bind(obj)!=fun.bind(obj) 反复bind只有第一次 ...

  4. EasyUI datagrid 一个可以 直接运行例子一个文件 六

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...

  5. Red Hat OpenShift

    Core Concepts 基本概念 Master Master监控其他Node和Pod 提供Web Console Node Node是k8s的工作机器 Node中运行Pod,pod可以在node中 ...

  6. vue全家桶+Koa2开发笔记(6)--app开发

    1.环境配置 详见文章<Nuxt 开发 - 项目初始化> 1.1  使用nuxt脚手架  https://zh.nuxtjs.org/guide/installation 1.2 在nod ...

  7. 【添加最新版本的mysql的jdbc连接jar包】java.math.BigInteger cannot be cast to java.lang.Long异常

    [问题描述] 从我的电脑把项目拷贝到guo小中的win8电脑,but出现了那个错误,估计他的mysql是最新版本的. [如何下载连接jar包] 链接:https://pan.baidu.com/s/1 ...

  8. python基础(四)——正则表达式

    #!/usr/bin/python # -*- coding: utf-8 -*- import re print(re.match('www', 'www.runoob.com').span()) ...

  9. skipper lua 添加luarocks 包管理

    skipper 支持基于lua 的script 扩展,同时设计比较方便的filter模型,让我们可以方便 进行request.response的扩展,结合lua 社区的包我们可以快速的进行新功能的开发 ...

  10. Stream processing with Apache Flink and Minio

    转自:https://blog.minio.io/stream-processing-with-apache-flink-and-minio-10da85590787 Modern technolog ...