数据范围: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. BZOJ2761_不重复数字_KEY

    题目传送门 Map水过(或set也行). code: /************************************************************** Problem: ...

  2. 苏州Uber优步司机奖励政策(1月11日~1月17日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 相机imu外参标定

    1. 第一步初始化imu外参(可以从参数文档中读取,也可以计算出),VINS中处理如下: # Extrinsic parameter between IMU and Camera. estimate_ ...

  4. Javascript闭包例子

    闭包的概念 内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止.可理解为,闭包就是能够读取其他函数内部变量的函数. 表现形式是:定义在函数内部的函数. function f1() ...

  5. c# enum 解析

    解析定义的枚举 public enum OrderPaymentStatus { /// <summary> /// 未支付 /// </summary> [Descripti ...

  6. 第十五届北京师范大学程序设计竞赛现场决赛题解&源码(A.思维,C,模拟,水,坑,E,几何,思维,K,字符串处理)

    #include <bits/stdc++.h> using namespace std; int main() { int T,n,a,b; while(cin>>T) { ...

  7. 「日常训练」Alternative Thinking(Codeforces Round #334 Div.2 C)

    题意与分析 (CodeForces - 603A) 这题真的做的我头疼的不得了,各种构造样例去分析性质... 题意是这样的:给出01字符串.可以在这个字符串中选择一个起点和一个终点使得这个连续区间内所 ...

  8. python学习笔记02 --------------基础数据类型

    python的基本数据类型: 1.基本数据 1.1. 数字类型 1.1.1 整数 int int()           #将括号内内容转化为整数类型. 1.1.2 浮点数 float 1.1.3 复 ...

  9. C for阶乘

    #include <stdio.h> int main(int argc, char **argv) { //定义三个变量 x n s ,n s的初始值为1;      int x;  i ...

  10. 【转】Buff机制及其实际运用

    转自 http://bbs.gameres.com/forum.php?mod=viewthread&tid=215027 首先我想说的是,这是一套机制,并不是单独的一个系统,所谓机制就是一种 ...