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 到 ...
随机推荐
- JSON初体验(三):FastJson解析
JSON解析之FastJson(阿里巴巴解析开源) 特点: Fastjson是一个Java语言编写的高性能功能完善的JSON库,它采用的 是一种"假定有序快速匹配"的算法,把JSO ...
- 成都Uber优步司机奖励政策(1月7日)
1月7日 奖励政策 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblog ...
- sphinx生成cakephp文档
cakephp的文档是用一个叫sphinx程序生成的 这个程序是python写的,所以我们要用sphinx本机必须先装python. 编译过程在Ubuntu下进行,默认Ubuntu已经安装了pytho ...
- CC3200底板测试-烧写CC3200-LAUNCHXL
1. 拿到板子,先研究一下几个跳线帽的作用.我在底板上测到VCC_DCDC_3V3和VCC_BRD之间应该有一个跳线帽的,但是在原理上找不到. 2. LED灯的用途,测试的时候,发现这个灯有时候亮,有 ...
- HTML 常见的 DOCTYPE 声明
<!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关 ...
- [USACO09Open] Tower of Hay 干草塔
为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上运来,共会出现N包干草,第i包干草的宽度是W i ,高度和长度统一为1.干草塔要从底层开始铺建.贝西会选择最先 ...
- C if 判断 else 否则
#include <stdio.h> int main(int argc, char **argv) { //新建三个变量进行比较 int a,b,c; //输入三个变量的值scanf(& ...
- (转)Shadow Mapping
原文:丢失,十分抱歉,这篇是在笔记上发现的.SmaEngine 阴影和级联部分是模仿UE的结构设计 This tutorial will cover how to implement shadow ...
- 使用bing或google来翻译网页
google代码:在</head>之后插入 <meta name="google-translate-customization" content="4 ...
- 简单构建基于RDF和SPARQL的KBQA(知识图谱问答系统)
本文主要通过python实例讲解基于RDF和SPARQL的KBQA系统的构建.该项目可在python2和python3上运行通过. 注:KBQA即是我们通常所说的基于知识图谱的问答系统.这里简单构建的 ...