jzoj3865[JSOI2014]士兵部署
‘
数据范围:n,m<=10^5,传送门:https://jzoj.net/senior/#main/show/3865
感觉jzoj好高明啊,就是访问不太稳定.
首先题意中被n个点控制的区域相当于这n个点组成的凸包.那么题意相当于m次询问这n个点的点集在加入一个点后的凸包面积.每次加入一个点之后的凸包至少不会比原来n个点组成的凸包小,因此我们先使用Graham扫描法在nlogn时间内求出原先n个点的凸包.
考虑加入一个点后凸包面积的变化.如果这个点在凸包内,那么面积不变.否则,这个点将位于新的凸包上,并且使得原凸包的连续一段不再出现在凸包上(即过这个点作凸包的切线).注意新凸包的面积总可以表示为原凸包上连续的一段顶点之间的叉积再加上新加入的点和两个原凸包上的点的叉积,为了快速求取面积,需要预处理叉积的前缀和.
新加入的点的位置以及过这个点的凸包切线都可以通过二分求得.总复杂度O(nlogn+mlogn),具体实现时可以找凸包的一个顶点,从这里出发将凸包和整个平面剖分成几部分,以此确定新加入的点的位置并分类讨论求解。
可以参照下图进行理解,蓝色实线为原先的凸包,以左上的点A为中心进行区域的分割,红色虚线为区域的边界线,黑色的点加入后不会影响凸包的面积,彩色的点加入后会影响凸包的面积,切线用对应颜色的虚线标出.
吐槽:本来是可以1A的,结果我怕共线出事对所有点的坐标随机扰动了一下就炸精度了....不随机扰动就A了....数据比较良心,似乎并没有所有点共线的情况(没有特殊处理也过了)

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=;
const double eps=1e-;
int cmp(double x){return x<-eps?-:x>eps;}
int seed;
int nxt_rand(){
return ;
seed=(seed*+)%;
return seed;
}
struct point{
double x,y;
point(){}
point(double a,double b){x=a;y=b;}
void read(){scanf("%lf%lf",&x,&y);}
bool operator <(const point &B)const{
return cmp(x-B.x)==?cmp(y-B.y)==-:cmp(x-B.x)==-;
}
}P[maxn];
point operator +(const point &A,const point &B){return point(A.x+B.x,A.y+B.y);}
point operator -(const point &A,const point &B){return point(A.x-B.x,A.y-B.y);}
double cross(const point &A,const point &B){return A.x*B.y-A.y*B.x;}
point S[maxn];int top=;
int n,m;
void ConvexHull(){
for(int i=;i<n;++i){
while(top>&&cmp(cross(S[top-]-S[top-],P[i]-S[top-]))>=)top--;
S[top++]=P[i];
}
int lim=top;
for(int i=n-;i>=;--i){
while(top>lim&&cmp(cross(S[top-]-S[top-],P[i]-S[top-]))>=)top--;
S[top++]=P[i];
}
top--;
}
bool inside(point C){
return cmp(cross(C-S[],S[]-S[]))>=&&cmp(cross(S[top-]-S[],C-S[]))>=;
}
int binary1(int l,int r,point C){
while(l<=r){
int mid=(l+r)>>;
if(cmp(cross(S[mid]-S[mid-],C-S[mid]))==)r=mid-;
else l=mid+;
}
return l-;
}
int binary2(int l,int r,point C){
while(l<=r){
int mid=(l+r)>>;
if(cmp(cross(S[mid]-C,S[mid+]-S[mid]))==)l=mid+;
else r=mid-;
}
return r+;
}
double pre[maxn],suf[maxn];
int main(){
// for(int i=1;i<=100;++i)printf("%d\n",nxt_rand());
scanf("%d%d",&n,&m);
for(int i=;i<n;++i)P[i].read();
if(n==){
for(int i=;i<=m;++i)printf("0.0\n");
}else if(n==){
point C;
for(int i=;i<=m;++i){
C.read();
printf("%.1f\n",fabs(cross(C-P[],P[]-P[]))/2.0);
}
}else{
sort(P,P+n);
ConvexHull();
for(int i=;i<top;++i){
pre[i]=suf[i]=cross(S[i],S[i+]);
}
for(int i=;i<top;++i)pre[i]+=pre[i-];
for(int i=top-;i>=;--i)suf[i]+=suf[i+];
point C;
double ori=fabs(pre[top-])/2.0;
for(int i=;i<=m;++i){
C.read();
if(inside(C)){
int l=,r=top-;
while(l<=r){
int mid=(l+r)>>;
if(cmp(cross(S[mid]-S[],C-S[]))==){
r=mid-;
}else{
l=mid+;
}
}
int pos=r+;
if(cmp(cross(S[pos]-S[pos-],C-S[pos-]))<=){
printf("%.1f\n",ori);
}else{
int L=binary1(,pos-,C),R=binary2(pos,top-,C);
double area=pre[L-]+suf[R]+cross(S[L],C)+cross(C,S[R]);
printf("%.1f\n",fabs(area)/2.0);
}
}else if(cmp(cross(C-S[],S[]-S[]))==){
int L=,R;
int l=,r=top-;
while(l<=r){
int mid=(l+r)>>;
if(cmp(cross(S[mid+]-S[mid],C-S[mid]))==-){
l=mid+;
}else{
r=mid-;
}
}
R=r+;
double area=pre[R-]+cross(S[R],C)+cross(C,S[]);
printf("%.1f\n",fabs(area)/2.0);
}else if(cmp(cross(C-S[],S[top-]-S[]))==-){
int L=,R;
int l=,r=top-;
while(l<=r){
int mid=(l+r)>>;
if(cmp(cross(S[mid]-S[mid-],C-S[mid-]))==)l=mid+;
else r=mid-;
}
R=l-;
double area=cross(S[],C)+cross(C,S[R])+suf[R];
printf("%.1f\n",fabs(area)/2.0);
}else{
int L=,R=;
int l=,r=top-;
while(l<=r){
int mid=(l+r)>>;
if(cmp(cross(S[mid]-S[mid-],C-S[mid-]))==)l=mid+;
else r=mid-;
}
L=l-;
l=;r=top-;
while(l<=r){
int mid=(l+r)>>;
if(cmp(cross(S[mid+]-S[mid],C-S[mid]))==)r=mid-;
else l=mid+;
}
R=r+;
double area=pre[R-]-pre[L-]+cross(C,S[L])+cross(S[R],C);
printf("%.1f\n",fabs(area)/2.0);
}
}
}
return ;
}
jzoj3865[JSOI2014]士兵部署的更多相关文章
- 【转】Java自学之路——by马士兵
作者:马士兵老师 JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟 ...
- [感悟]马士兵Java自学之路——(精华版)
JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...
- [原]CentOS7.2部署node-mapnik
转载请注明表作者think8848及出处(http://think8848.cnblogs.com) node-mapnik依赖项中要求g++ >= 5, toolchain (>= GL ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...
- 结合Jexus + Kestrel 部署 asp.net core 生产环境
ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...
- 4.Windows Server2012 R2里面部署 MVC 的网站
网站部署之~Windows Server | 本地部署:http://www.cnblogs.com/dunitian/p/4822808.html#iis 后期会在博客首发更新:http://dnt ...
- Win10 IIS本地部署MVC网站时不能运行?
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 部署后出现这个错误: 打开文件目录后发现是可以看见目录的,静态页面也是可以打开的 ...
- 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)
上一节部署了 cirros-vm1 到 first_local_net,今天我们将再部署 cirros-vm2 到同一网络,并创建 second_local_net. 连接第二个 instance 到 ...
随机推荐
- Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)
设计模式系列参考: http://www.cnblogs.com/Coda/p/4279688.html 一.概述 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高 ...
- Java基础—ArrayList源码浅析
注:以下源码均为JDK8的源码 一. 核心属性 基本属性如下: 核心的属性其实是红框中的两个: //从注释也容易看出,一个是集合元素,一个是集合长度(注意是逻辑长度,即元素的个数,而非数组长度) 其中 ...
- [Python3.X]python 实现斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...
- 华天正real210开发板测试-第1篇
1. 网上买的real210二手开发板,今天刚到测试一下 2. 启动方式,不过目前唯一的问题是没有开发资料,然后给原厂发了份邮件要资料,原厂爽快的给了,必须给华天正这服务态度点个赞啊 3. 调到nan ...
- Android远程推送笔记
Android远程推送笔记 Android推送有很多种实现方案,但都没办法和苹果的APNS比拟,这里主要来讲述一下我遇到的问题,和作出的抉择. 首先,为了快速接入,所以就没有自己搭建推送服务器,而是使 ...
- C#调用大漠插件,发送QQ和微信消息
大漠插件就不过多介绍了,不知道的请查下百度.主要是讲解C#怎么调用大漠插件. 大漠插件提供了COM版本,C#直接点击引用,添加即可.然后注册下大漠插件到系统文件夹,注册代码如下: static str ...
- NSNull Crash处理 (NullSafe 的原理)
问题场景 后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符串 (1)原始的json串:后端返回 ...
- 强制删除无用old windows文件夹命令
磁盘上有旧系统留下的目录比如old.windows.program files.users(中文目录是用户,删除命令里还是要用user才有效),因为目录的特殊设置,导致无法直接删除,需要修改属性和权限 ...
- Appium-测试失败后屏幕截图的
本文参考:http://www.cnblogs.com/hexianl/p/4958556.html 使用testng测试框架进行管理测试 1.创建监听,代码如下: import io.appium. ...
- 安装mysql-5.7.12-winx64
之前安装mysql时未做总结,换新电脑,补上安装记录,安装的时候,找了些网友的安装记录,发现好多坑 1.mysql-5.7.12-winx64.zip下载 官方下载地址:http://dev.mysq ...