Printed Circuit Board (board)

题目描述

给出一个N个顶点的简单多边形,对于每个顶点,假如它和原点连成的线段只在这个顶点处和多边形相交,就称为满足要求的顶点。你的任务是输出所有满足要求的顶点编号。

输入

第一行一个正整数N。下面N行每行两个不超过10e6的正整数,依次表示每个顶点的坐标。顶点按照输入顺序用正整数1..N编号,并且顶点保证按照顺时针或逆时针顺序给出。

输出

第一行一个正整数M,表示满足要求的顶点个数。第二行M个正整数,按照升序给出满足要求的顶点编号。


solution

计算几何好题

首先我们按极角把点离散化了。

一条条加入边,判断覆盖一个点的边是不是他的临边就是答案

注意到覆盖区间时没必要覆盖到底,打在区间上即可,查询时一路统计答案。

那么·还剩一个问题,怎么判断两条边谁前谁后。

我们用

第一条边y较小的和第二条边y较大的

第一条边y较大的和第二条边y较小的

叉积起来

画画图就可以发现了

有一个细节,相同斜率的点其实不用特判。

因为那些点怎么都不会被覆盖。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define db double
#define ll long long
#define maxn 200005
#define inf 1e9
using namespace std;
int n,tot,li,ri,ans[maxn],flag[maxn],t;
struct node{
int x,y,id;db k;
}s[maxn];
int tr[maxn*4];
map<double,int>l;
bool cmp(node a,node b){ return a.k<b.k||(a.k==b.k&&a.x<b.x);
}
bool C(node a,node b){
return a.id<b.id;
}
node xl(node a,node b){
node t;t.x=b.x-a.x;t.y=b.y-a.y;return t;
}
ll cr(node a,node b){
return (ll)a.x*b.y-(ll)a.y*b.x;
}
bool pd(int a,int b){
node p1,p2,p3,p4;
p1=s[a];p2=s[a+1];if(a==n)p2=s[1];
p3=s[b];p4=s[b+1];if(b==n)p4=s[1];
if(p1.k>p2.k)swap(p1,p2);if(p3.k>p4.k)swap(p3,p4);
node A=xl(p1,p4),B=xl(p2,p3);
if(cr(A,B)<0)return 0;//a close
else return 1;
}
void update(int &x,int now){
if(!x)x=now;
else if(pd(x,now))x=now;
}
void add(int k,int l,int r,int id){
if(l>=li&&r<=ri){update(tr[k],id);return;}
int mid=l+r>>1;
if(li<=mid)add(k*2,l,mid,id);
if(ri>mid)add(k*2+1,mid+1,r,id);
}
void ask(int k,int l,int r,int pl){
if(tr[k])update(t,tr[k]);
if(l==r)return;
int mid=l+r>>1;
if(pl<=mid)ask(k*2,l,mid,pl);
else ask(k*2+1,mid+1,r,pl);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d%d",&s[i].x,&s[i].y);s[i].id=i;
if(!s[i].x)s[i].k=inf;
else s[i].k=(db)s[i].y/(db)s[i].x;
}
sort(s+1,s+n+1,cmp);
s[0].k=-1;
for(int i=1;i<=n;i++){
if(s[i].k==s[i-1].k){flag[s[i].id]=1;continue;}
l[s[i].k]=++tot;
}
sort(s+1,s+n+1,C);
for(int i=1;i<=n;i++){
li=l[s[i].k],ri=l[s[i+1].k];int D=i;
if(i==n)ri=l[s[1].k];
if(li>ri)swap(li,ri);
add(1,1,n,i);
}
for(int i=1;i<=n;i++){
t=0;ask(1,1,n,l[s[i].k]);
if(i==1){if(t==n||t==1)ans[i]=1;}
else {if(t==i||t==i-1)ans[i]=1;}
}
int sum=0;
for(int i=1;i<=n;i++){
if(flag[i])continue;
if(ans[i])sum++;
}
cout<<sum<<endl;
for(int i=1;i<=n;i++){
if(flag[i])continue;
if(ans[i])printf("%d ",i);
}
cout<<endl;
return 0;
}

Printed Circuit Board (board)的更多相关文章

  1. bzoj2856: [ceoi2012]Printed Circuit Board

    Description 给出一个N个顶点的简单多边形,对于每个顶点,假如它和原点连成的线段只在这个顶点处和多边形相交,就称为满足要求的顶点.你的任务是输出所有满足要求的顶点编号. Input 第一行一 ...

  2. PatentTips - Solid State Disk (SSD) Device

    BACKGROUND OF THE INVENTION A SSD apparatus is a large-capacity data storage device using a nonvolat ...

  3. COB(Chip On Board) 工艺技术

    COX(Chip On X) •X 基板:  PCB (Printed circuit board)  FPC (Flexible Printed Circuit)  Glass •导线焊接 球形焊接 ...

  4. [Swift]LeetCode419. 甲板上的战舰 | Battleships in a Board

    Given an 2D board, count how many battleships are in it. The battleships are represented with 'X's, ...

  5. 微信小程序 项目实战(二)board 首页

    1.项目结构 2.页面 (1)数据(逻辑) board.js // pages/board/board.js Page({ /** * 页面的初始数据 */ data: { imgWrap: [] } ...

  6. 特邀美国EMC实战专家Mark来华授课

    “轻松搞定EMC-PCB和系统设计”课程介绍 本次课程特邀美国EMC领域权威专家Mark Montrose主讲,将涵盖满足产品电磁兼容性和信号完整性的基本原理.课程涉及多个领域,不仅仅针对PCB设计, ...

  7. 【PCB】扫盲总结

    1.PCB是什么 PCB( Printed Circuit Board),中文名称为印制电路板,又称印刷线路板,是重要的电子部件,是电子元器件的支撑体,是电子元器件电气连接的载体.由于它是采用电子印刷 ...

  8. 阻抗计算公式、polar si9000(教程)

    给初学者的一直有很多人问我阻抗怎么计算的. 人家问多了,我想给大家整理个材料,于己于人都是个方便.如果大家还有什么问题或者文档有什么错误,欢迎讨论与指教!在计算阻抗之前,我想很有必要理解这儿阻抗的意义 ...

  9. RFID 读写器 Reader Writer Cloner

    RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...

随机推荐

  1. Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; 没有sessionFactory

    maven子项目spring配置文件创建bean 没有找到另一个子项目中的bean. 需要引入另一个子项目的配置文件,仅提供测试用 如下: <!-- 仅供测试用 --> <impor ...

  2. springMVC 面试题整理

    1. springMVC怎么样把某个请求映射到特定的方法上面? 答:直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路径. 2. @RequestMapping注解 ...

  3. scrapy--doutu

    年轻人都爱斗图,可是有时候斗图的数量比较少.就想办法收藏其他的人图片,然而只要能在doutula网页里爬取图片,是一件很棒的的事,看别人写爬斗图的爬虫程序有点麻烦,自己也来动动手,简单,实用.给大家分 ...

  4. Requests库:python实现的简单易用的http库

    1.get请求: get(url, params, headers) 2.json 解析 3.content 获取二进制内容 4.headers 添加 5.post请求:post(url,data,h ...

  5. 【文件处理】xml 文件 SAX解析

    SAX的全称是Simple APIs for XML,也即XML简单应用程序接口. 与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. 当使用SAX分析器对XML文档 ...

  6. CSS3 Shape ---使用形状改变旁边内容的布局

    注意 本文所实现的功能,在浏览器的支持上并不好,除chrome浏览器外其余的大部分浏览器均不支持,虽然可以使用polyfill解决,但也不能很好的支持,有时也会出错 polyfill使用方法 下载po ...

  7. SpringMVC---其它常用注解

    常用注解 PathVariable @RequestMapping注解中使用占位符的情况下,需要使用@PathVariable注解指定占位符参数.即指定占位符中的值与方法中哪一个参数进行匹配.如果方法 ...

  8. laravel5.5服务提供器

    目录 1. 编写服务提供器 1.1 注册方法 register 1.1.1 简单绑定 1.1.2 绑定单例 1.1.3 绑定实例 1.1.4 绑定初始数据 1.2 引导方法 boot 2. 注册服务提 ...

  9. Xcode坑之一Invalid argument

    Xcode坑之一Invalid argument 正在搞代码,运行程序时突然发现程序不能再次运行了,一运行就提示Invalid argument 然后FQ各种查啊,试了好多方法都不行,重启,重置,我用 ...

  10. python的inspect模块

    一.type and members 1. inspect.getmembers(object[, predicate]) 第二个参数通常可以根据需要调用如下16个方法: 返回值为object的所有成 ...