题意:

    在二维平面上给出n条不共线的线段,问这些线段总共覆盖到了多少个整数点

  

  解法:

      用GCD可求得一条线段覆盖了多少整数点,然后暴力枚举线段,求交点,对于相应的

    整数交点,结果-1即可

  

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define eps 1e-6
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Fore(i,a,b) for(int i=a;i>=b;i--)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mkp make_pair
#define pb push_back
#define sz size()
#define met(a,b) memset(a,b,sizeof(a))
#define iossy ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define fr freopen
#define pi acos(-1.0)
#define Vector Point
typedef pair<int,int> pii;
const long long linf=1LL<<;
const int iinf=<<;
const double dinf=1e17;
const int Mod=1e9+;
typedef long long ll;
typedef long double ld;
const int maxn=;
int n;
struct Point{
ll x,y;
int id;
Point(ll x=,ll y=):x(x),y(y) {}
Point operator - (const Point &a)const { return Point(x-a.x,y-a.y);}
bool operator == (const Point &a)const { return x==a.x && y==a.y; }
};
ll Cross(Vector a,Vector b){
return a.x*b.y-a.y*b.x;
}
ll Dot(Vector a,Vector b) {
return a.x*b.x+a.y*b.y;
}
bool onsg(Point p,Point a1,Point a2){
return Cross(a1-p,a2-p)== && Dot(a1-p,a2-p)<;
}
void ck(ll &c){
if(c>) c=;
else if(c<) c=-;
}
int Ins(Point a1,Point a2,Point b1,Point b2){
if(a1==b1 || a1==b2 || a2==b1 || a2==b2) return ;
if(onsg(a1,b1,b2) || onsg(a2,b1,b2) || onsg(b1,a1,a2) || onsg(b2,a1,a2)) return ;
ll c1=Cross(a2-a1,b1-a1),c2=Cross(a2-a1,b2-a1);
ll c3=Cross(b2-b1,a1-b1),c4=Cross(b2-b1,a2-b1);
ck(c1);ck(c2);ck(c3);ck(c4);
return c1*c2< && c3*c4<;
}
set<pair<ll,ll> >c;
void chk(Point p,Vector v,Point q,Vector w){
Vector u=p-q;
ll v1=Cross(w,u),v2=Cross(v,w);
if(abs(v1*v.x)%v2!= || abs(v1*v.y)%v2!=) return ;
ll xx,yy;
xx=p.x+v.x*v1/v2;yy=p.y+v.y*v1/v2;
c.insert(mkp(xx,yy));
}
struct segm{
Point p1,p2;
};
segm ss[maxn];
Point p1,p2;
void solve(){
iossy;
cin>>n;
int ans=;
For(i,,n){
cin>>p1.x>>p1.y>>p2.x>>p2.y;
ss[i].p1=p1;ss[i].p2=p2;
ans+=__gcd(abs(ss[i].p2.x-ss[i].p1.x),abs(ss[i].p2.y-ss[i].p1.y))+;
}
For(i,,n){
c.clear();
For(j,i+,n){
int ct=Ins(ss[i].p1,ss[i].p2,ss[j].p1,ss[j].p2);
if(ct) chk(ss[i].p1,ss[i].p2-ss[i].p1,ss[j].p1,ss[j].p2-ss[j].p1);
}
ans-=c.sz;
}
//cout<<ans-c.sz<<endl;
cout<<ans<<endl;
}
int main(){
int t=;
// For(i,1,t) printf("Case #%d: ",i);
solve();
return ;
}

[CodeForces-1036E] Covered Points 暴力 GCD 求交点的更多相关文章

  1. Codeforces 1036E Covered Points (线段覆盖的整点数)【计算几何】

    <题目链接> <转载于 >>>  > 题目大意: 在二维平面上给出n条不共线的线段(线段端点是整数),问这些线段总共覆盖到了多少个整数点. 解题分析: 用GC ...

  2. Codeforces 1036E. Covered Points

    又一次写起了几何.... 特殊处理在于有可能出现多条线段交于一点的情况,每次考虑时,对每条线段与其他所有线段的交点存在一个set里,对每一个set,每次删除set.size()即可 重点在于判断两条线 ...

  3. CodeForces 1000C Covered Points Count(区间线段覆盖问题,差分)

    https://codeforces.com/problemset/problem/1000/C 题意: 有n个线段,覆盖[li,ri],最后依次输出覆盖层数为1~n的点的个数. 思路: 区间线段覆盖 ...

  4. codeforces 1000C - Covered Points Count 【差分】

    题目:戳这里 题意:给出n个线段,问被1~n个线段覆盖的点分别有多少. 解题思路: 这题很容易想到排序后维护每个端点被覆盖的线段数,关键是端点值不好处理.比较好的做法是用差分的思想,把闭区间的线段改为 ...

  5. C - Covered Points Count CodeForces - 1000C (差分,离散化,统计)

    C - Covered Points Count CodeForces - 1000C You are given nn segments on a coordinate line; each end ...

  6. EDU 50 E. Covered Points 利用克莱姆法则计算线段交点

    E. Covered Points 利用克莱姆法则计算线段交点.n^2枚举,最后把个数开方,从ans中减去. ans加上每个线段的定点数, 定点数用gcs(△x , △y)+1计算. #include ...

  7. Educational Codeforces Round 46 C - Covered Points Count

    C - Covered Points Count emmm 好像是先离散化一下 注意 R需要+1 这样可以确定端点 emmm 扫描线?瞎搞一下? #include<bits/stdc++.h&g ...

  8. 个人项目作业$\cdot$求交点个数

    个人项目作业\(\cdot\)求交点个数 一.作业要求简介 本次作业是北航计算机学院软件工程课程的个人项目作业,个人开发能力对于软件开发团队是至关重要的,本项目旨在通过一个求几何图形的交点的需求来使学 ...

  9. POJ 1039 Pipe(直线和线段相交判断,求交点)

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8280   Accepted: 2483 Description ...

随机推荐

  1. 近几年杭电OJ大型比赛题目合集【更新到2017年11月初】

    2017年: 区域赛网络赛   6194~6205    6206~6216 区域赛网络赛   6217~6229 2016年: 区域赛网络赛  5868~5877    5878~5891    5 ...

  2. mysql 案例 ~ pt-kill工具的使用

    一 简介:学习pt-kill工具使用 二 功能: 能按照多维角度进行kill的查杀,迅速的降低数据库使用负载 三 常用命令 pt-kill  --match-command 'Query|Sleep' ...

  3. ODPS

    ODPS 功能之概述篇 原文  http://blog.aliyun.com/2962 主题 SQL 概述 ODPS是阿里云基于自有的云计算技术研发一套开放数据处理服务(Open Data Proce ...

  4. Pytorch入门之VAE

    关于自编码器的原理见另一篇博客 : 编码器AE & VAE 这里谈谈对于变分自编码器(Variational auto-encoder)即VAE的实现. 1. 稀疏编码 首先介绍一下“稀疏编码 ...

  5. 025_set专题

    一.sed过滤maven的setting文件的XML注释 sed 's/<!--.*-->//g' /usr/local/apache-maven-3.5.0/conf/settings. ...

  6. uboot 传递的参数 mtdparts

    启动uboot后,在重新烧写程序之前,查看传递给内核的参数时(命令为: printenv),看到如下内容: bootargs=console=ttyS0,115200 mtdparts=spi0.0: ...

  7. 解决重新安装sqlserver2008报错Reporting Services目录数据库文件存在的问题

    删除安装目录如: D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA 目录下的reporting.mdf和日 ...

  8. Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

    # yum install -y vim Loaded plugins: fastestmirror, presto Loading mirror speeds from cached hostfil ...

  9. centos6.5下vsftpd服务的安装及配置并通过pam认证实现虚拟用户文件共享

    FTP的全称是File Transfer Protocol(文件传输协议),就是专门用来传输文件的协议.它工作在OSI模型的第七层,即是应用层,使用TCP传输而不是UDP.这样FTP客户端和服务器建立 ...

  10. 使用Let's Encrypted HPPTS你的网站

    1.前言 最近,有同事咨询我,怎么样使用Let's Encrypted部署数字证书,于是,结合自己之前的实践,简单总结下. 2.HTTPS的优势 什么加密,防篡改,防广告植入什么的,这个就不多说了.这 ...