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. 提高篇(1):RMQ问题与ST表

    RMQ是英文Range Minimum/Maximum Query的缩写,是询问某个区间内的最值,这里讲一种解法:ST算法 ST算法通常用在要多次(10^6级别)询问区间最值的问题中,相比于线段树,它 ...

  2. vue学习--Props

    Props:        props用以从父组件接收数据:                     使用:                Vue.component('child',{        ...

  3. POJ-3126 BFS,埃式筛选及黑科技

    题目大意:给定两个四位素数a  b,要求把a变换到b,变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数  与  前一步得到的素数  只能有一个位不同,而且每步得到的 ...

  4. 牛客暑假多校第一场J-Different Integers

    一.题目描述: 链接:https://www.nowcoder.com/acm/contest/139/JGiven a sequence of integers a1, a2, ..., an an ...

  5. Storm: 集群安装和配置

    前期准备:3台服务器: 192.168.8.94  192.168.8.95 192.168.8.96 去storm官网下载响应版本的软件包:http://storm.apache.org/downl ...

  6. Android Studio的Log日志调试

    本人菜鸟一枚,极大发挥了搜索的功能.现记录一番,以备后患. 用断点真的很烦,因为之前写linux的时候,就是用最蠢但是也是挺有帮助的printf()来进行调试. 其实用Log输出日志的原理也是差不多的 ...

  7. 1096: [ZJOI2007]仓库建设

    1096: [ZJOI2007]仓库建设 思路 斜率优化. 代码 #include<cstdio> #include<iostream> using namespace std ...

  8. laravel5.5http会话机制

    1.配置文件 config/session.php 大多数是用file驱动,将session保存在storage/framework/sessions,可以考虑使用redis或者memcached 驱 ...

  9. 考拉Android统一弹框

    作者:钱成杰 背景 在快速开发的背景下,经历了n个版本后的考拉Android App中已经存在了各种各样看似相同却各有差别的弹框样式.其中包括系统弹框和自定义弹框,并且在线上时常会出现IllegalA ...

  10. 《Cracking the Coding Interview》——第6章:智力题——题目4

    2014-03-20 01:02 题目:无力描述的一道智力题,真是货真价实的智力题,让我充分怀疑自己智力的智力题.有兴趣的还是看书去吧. 解法:能把题目看懂,你就完成80%了,用反证法吧. 代码: / ...