P3316 [SDOI2014] 里面还是外面

news/2025/4/1 21:18:00/文章来源:https://www.cnblogs.com/wjwweiwei/p/18801073

\lxl/\lxl/
判断一个点是否在多边形内通常的做法是引一条射线,算出交点个数奇偶性。
那么我们就可以令这条射线平行于\(y\)轴,现在只用快速算出这样的交点数就好了。
考虑将多边形的每条边抽离。按\(x\)坐标建立线段树后,将线段插入到\(O(\log n)\)个线段树节点上,这样每个节点所代表的\(x\)坐标区间内,线段都是贯穿的,并且不相交(除了顶点)。
因为我们要支持查询某个\(x=P\)直线与若干线段交点中,纵坐标\(\le K\)的个数,线段需要带修,所以我们对每个线段树节点开一棵平衡树维护插入、删除、查排名操作就好了。
PEKKA说要用vector写平衡树,确实能冲。
代码:

#include<bits/stdc++.h>
#define db long double
using namespace std;
using ll=long long;
char *p1,*p2,buf[100000];
#define gc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
inline int read(){int x=0,f=1;char c=gc();for(;c<'0'||c>'9';c=gc())if(c=='-')f=-1;for(;c>='0'&&c<='9';c=gc())x=(x<<1)+(x<<3)+c-'0';return x*f;
}
const int N=2e5+5;
const int INF=1e9,V=1e9;
int n,q;
struct Point{int x,y;
}p[N];
int pcnt,lcnt;
unordered_map<ll,int>um_p,um_l;
struct Line{Point st,ed;Line(){}Line(Point ps,Point pd){st=ps,ed=pd;if(st.x>ed.x)swap(st,ed);}inline db gt(int pos){db k=1.0*(ed.y-st.y)/(ed.x-st.x);db b=ed.y-k*ed.x;return pos*k+b; }inline bool bon(int x,int y){if(x<st.x||x>ed.x)return 0;return 1ll*(st.x-x)*(ed.y-st.y)==1ll*(ed.x-st.x)*(st.y-y);}
}li[N];
inline ll ghas(int x,int y){return 1ll*(INF+1)*x+y;}
inline int gpo(int x,int y){return um_p[ghas(x,y)];}
inline int glin(int x,int y){if(x>y)swap(x,y);return um_l[ghas(x,y)];}
bool mbo;
struct V_Treap{int lp,rp;struct pnod{int id,pos;inline bool operator <(const pnod P){return li[id].gt(pos)<li[P.id].gt(pos);}};inline void init(int pl,int pr){lp=pl,rp=pr;}vector<pnod>tr;inline void ins(int x){tr.insert(lower_bound(tr.begin(),tr.end(),(pnod){x,lp}),{x,lp});}inline void era(int x){tr.erase(lower_bound(tr.begin(),tr.end(),(pnod){x,lp}));}inline int qry(int x,int y){if(tr.empty())return 0; int l=0,r=(int)tr.size()-1;while(l<=r){int mid=(l+r)>>1;if(li[tr[mid].id].bon(x,y)){mbo=1;return 0;}if(li[tr[mid].id].gt(x)-1e-9<=y)l=mid+1;else r=mid-1;}return l;}
}trp[N<<6];
struct node{int ls,rs;
}tr[N<<6];
int cnt;
struct SGT{#define ls(p) tr[p].ls#define rs(p) tr[p].rsint rt;void upd(int &p,int l,int r,int x,int y,int v,int w){if(!p)p=++cnt,trp[p].init(l,r);if(x<=l&&r<=y)return w==1?trp[p].ins(v):trp[p].era(v);if(r==l+1)return ;int mid=(l+r)>>1;if(x<=mid)upd(ls(p),l,mid,x,y,v,w);if(y>=mid)upd(rs(p),mid,r,x,y,v,w);}inline void ins(int v){return upd(rt,0,V,li[v].st.x,li[v].ed.x,v,1);}inline void del(int v){return upd(rt,0,V,li[v].st.x,li[v].ed.x,v,-1);}int qry(int p,int l,int r,int x,int y){if(l>x||r<x)return 0;if(!p)return 0;if(l==r)return trp[p].qry(x,y);int res=trp[p].qry(x,y),mid=(l+r)>>1;res+=qry(ls(p),l,mid,x,y);res+=qry(rs(p),mid,r,x,y);return res;}inline int qry(int x,int y){return qry(rt,0,V,x,y);}
}T;
inline string to(int x){if(x==1)return "in";if(x==0)return "out";return "bd";
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);n=read();for(int i=1;i<=n;i++){p[i].x=read(),p[i].y=read();um_p[ghas(p[i].x,p[i].y)]=i;}for(int i=1;i<=n;i++){int nxt=i%n+1;um_l[ghas(min(i,nxt),max(i,nxt))]=i;li[i]=Line(p[i],p[i%n+1]);T.ins(i);}int las=T.qry(0,0)&1;if(mbo==1)las=2;pcnt=lcnt=n;int lasx=0,lasy=0;q=read();int op,r,xa,ya,xb,yb,xc,yc,x,y;for(int i=1;i<=q;i++){mbo=0;op=read();if(op==0){r=read(),xa=read(),ya=read(),xb=read(),yb=read(),xc=read(),yc
=read();if(las==1){x=(r*lasx+xa)%V;y=(r*lasy+ya)%V;}else if(las==0){x=(r*lasx+xb)%V;y=(r*lasy+yb)%V;}else{x=(r*lasx+xc)%V;y=(r*lasy+yc)%V;}lasx=x,lasy=y;las=T.qry(x,y);las&=1;if(mbo==1)las=2;cout<<to(las)<<"\n";}else{xa=read(),ya=read(),xb=read(),yb=read(),xc=read(),yc
=read();int ia=gpo(xa,ya),ib=gpo(xb,yb);p[++pcnt]={xc,yc};um_p[ghas(xc,yc)]=pcnt;int &v=um_l[ghas(min(ia,ib),max(ia,ib))];T.del(v);v=0;li[++lcnt]=Line(p[ia],p[pcnt]),um_l[ghas(ia,pcnt)]=lcnt,T.ins(lcnt);li[++lcnt]=Line(p[ib],p[pcnt]),um_l[ghas(ib,pcnt)]=lcnt,T.ins(lcnt);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908309.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

simple_php你 攻防世界

审计代码,看到几个关键信息。可以看到:构建payload 有a,b,两个值。 看哈, $a==0 and $a 所有字母转成数字的时候换成0 即可满足所有要求。要求不是数字。是数字就跳出。还要b>1234 构建payload:/?a=asd$b=1231232aaa看清楚哦。&是连接符。$这是美元符号ohhh

Linux 离线升级 RSYNC

前言:本文操作是在 CentOS-7 下执行的,不确定在其他 Linux 发布版是否能同样正常执行。1、检查前置依赖组件在安装 rsync 之前,需要确认已安装了相关依赖组件: gcc 、openssl-devel 、xxhash 、zstd 、lz4 。 rpm -qa | grep gccrpm -qa | grep openssl-develwhich xxhsumw…

AireOS WLC安装License报错

​1.概述 本文主要记录在AireOS的WLC上安装License错误的情况。License的类型也是传统的License,因为设备的型号已经EOL,相关的资料应该较少,这里进行可能问题的记录。 2.适用场景 型号:WLC2500,WLC5508 License类型:传统License文件,如.lic的文件类型。 其他的型号多数…

在VS2022中练习“栈”

1.vs不能使用#include<stdio.h>等c语言的头文件 解决方法: 在vs instuall中“c++控制台应用”右边的方框,点击它,从它的列表中找到windowsSDK10,点击安装,等待即可

weak_auth 攻防世界 简单密码

根据题目得知考察简单密码。 admin 123456 。。。。。。。

基于PI控制器的车辆行驶控制系统simulink建模与仿真

1.课题概述基于PI控制器的车辆行驶控制系统是一种常见的控制策略,它利用比例-积分(Proportional-Integral, PI)控制器来调整车辆的速度或方向以达到期望值。在本课题中,我们将完成基于PI控制器的车辆行驶控制系统simulink建模与仿真。通过PI控制器分别对车辆形式的角度和车…

cookie 攻防世界 应该不难的题 未完成。

看到的是这些 根据题目信息,关键信息在cookie中。f12看有look here 看到: 所以访问: 有该提示,需要看http响应。 应该就是要用burp来做了。这电脑没burp搁置。

分解因数

代码展示: #include <bits/stdc++.h> // 包含了几乎所有C++标准库头文件的万能头文件(不推荐在实际项目中使用,可能导致编译问题和命名冲突,但在竞赛等场景方便) using namespace std; // 使用标准命名空间,这样可以直接使用标准库中的函数和类型,无需加上std::…

请简述 Java 的内存模型,以及栈、堆、方法区分别存储什么内容?

jdk8以前jdk8以后内存分出的数据区域:程序计数器,Java 虚拟机栈,本地方法栈,堆,方法区,运行时常量池,字符串常量池。 栈: 局部变量表:存放方法参数和方法内定义的局部变量,包括基本数据类型(byte、short、int、long、float、double、char、boolean )以及对象引用。…

基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)FieldD = [rep([10],[1,Nums]);Areas;rep([0;0;0;0],[1,Nums])];gen = 0; Js = 0.5*rand(NIND,1); Objv = (Js+eps); gen =…

project4

完结撒花!记录一下 Bustub Concurrency Control 的实现过程。 Resourceshttps://15445.courses.cs.cmu.edu/fall2022 课程官网 https://github.com/cmu-db/bustub Bustub Github Repo https://www.gradescope.com/ 自动测评网站 GradeScope,course entry code: PXWVR5 https:…