数据范围: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]士兵部署的更多相关文章

  1. 【转】Java自学之路——by马士兵

    作者:马士兵老师 JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟 ...

  2. [感悟]马士兵Java自学之路——(精华版)

    JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...

  3. [原]CentOS7.2部署node-mapnik

    转载请注明表作者think8848及出处(http://think8848.cnblogs.com) node-mapnik依赖项中要求g++ >= 5, toolchain (>= GL ...

  4. 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

    最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...

  5. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

    ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...

  6. 结合Jexus + Kestrel 部署 asp.net core 生产环境

    ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...

  7. 4.Windows Server2012 R2里面部署 MVC 的网站

    网站部署之~Windows Server | 本地部署:http://www.cnblogs.com/dunitian/p/4822808.html#iis 后期会在博客首发更新:http://dnt ...

  8. Win10 IIS本地部署MVC网站时不能运行?

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 部署后出现这个错误: 打开文件目录后发现是可以看见目录的,静态页面也是可以打开的 ...

  9. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)

    上一节部署了 cirros-vm1 到 first_local_net,今天我们将再部署 cirros-vm2 到同一网络,并创建 second_local_net. 连接第二个 instance 到 ...

随机推荐

  1. 状压搜索 洛谷T47092 作业

    TYM 有 nn 本作业,编号为 1,\dots,n1,…,n. 由于 \mathrm{TYM}TYM 很喜欢偷懒,而且不喜欢消耗脑细胞,所以他选择跳着完成这 nn 本作业.此外,如果将做作业的顺序转 ...

  2. Nginx的try_files使用详解

    try_files 语法: try_files file ... uri 或 try_files file ... = code 默认值: 无 作用域: server location 按顺序检查文件 ...

  3. 20145226夏艺华 逆向及Bof基础实践

    逆向及Bof基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串,如图所示: 该程序同时 ...

  4. 使用GeoServer发布shp数据为WMS服务和WFS服务

    使用GeoServer发布shp数据为WMS服务和WFS服务 1安装GeoServer 2使用GeoServer上传数据 3使用GeoServer发布数据为WMS和WFS 看完本教程,你将学会安装Ge ...

  5. 初识主席树_Prefix XOR

    主席树刚接触觉得超强,根本看不懂,看了几位dalao的代码后终于理解了主席树. 先看一道例题:传送门 题目大意: 假设我们预处理出了每个数满足条件的最右边界. 先考虑暴力做法,直接对x~y区间暴枚,求 ...

  6. ROS Twist和Odometry消息类型使用(Python)

    消息类型: 1. Twist - 线速度角速度 通常被用于发送到/cmd_vel话题,被base controller节点监听,控制机器人运动 geometry_msgs/Twist geometry ...

  7. 跨平台编译Go程序(交叉编译)

    作用:比如你手头只有Mac系统,而你的用户有Linux和Windows的,他们也想用,你可以通过交叉编译出Linux和Windows上的可执行文件给他们用 (1)首先进入go/src 源码所在目录,执 ...

  8. join_tab计算代价

    此路不通,还是需要按照顺序进行计算

  9. 「日常训练」Two Substrings(Codeforces Round 306 Div.2 A)

    题意与分析 一道非常坑的水题.分析醒了补. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back ...

  10. Python-S9——Day82-CRM项目实战

    1.权限的概念: 2.RBAC的设计: 3.注册登录用户所有权限到session中: 4.权限的校验: 5.基于中间件的权限校验: 1.权限的概念: 1.1 项目与应用: Project App 1. ...