数据范围: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. Nginx的try_files使用详解

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

  2. 深圳Uber司机本周(7.13-7.19凌晨4:00)的奖励政策

    本周(7.13-7.19凌晨4:00)的奖励政策为: 佣金返还: 车费的20%适用于所有产品(不包括Tesla)无获取条件 翻倍补贴: 每周一到周四07:00-10:00/17:00-22:00:车费 ...

  3. P3379 【模板】最近公共祖先(LCA)

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...

  4. JAVA面试中问及HIBERNATE与 MYBATIS的对比

    第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好H ...

  5. “地表最贵iPhone”到货,iPhone XS 系列手机等你来测!

    WeTest 导读 9月13日,苹果正式发布了全新的 iPhone XS 系列智能手机,备受瞩目的iPhone家族新成员具体又是怎样的呢?   关于iPhone XS系列手机的那些新亮点   大屏.双 ...

  6. 03-JVM内存模型:堆与方法区

    一.堆(Heap) 1.1.什么是堆 堆是用于存放对象的内存区域.因此,它是垃圾收集器(GC)管理的主要目标.其具有以下特点: 堆在逻辑上划分为“新生代”和“老年代”.由于JAVA中的对象大部分是朝生 ...

  7. Oracle 字段拆分替换在合并成一条

    看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...

  8. [Clr via C#读书笔记]Cp14字符字符串和文本处理

    Cp14字符字符串和文本处理 字符 System.Char结构,2个字节的Unicode,提供了大量的静态方法:可以直接强制转换成数值: 字符串 使用最频繁的类型:不可变:引用类型,在堆上分配,但是使 ...

  9. C++复合类型(结构,共用体,枚举)

    •结构是用户定义的类型,而结构的声明定义了这种类型的数据属性. 一.关键字struct声明:   定义了一种新类型 struct inflatable{ char name[20];//结构成员 fl ...

  10. alpha-4

    前言 失心疯病源4 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 19:00~21:50 利用背景相减法完成背景构建与更新模块,查找关于blob更多的论文资 ...