bzoj3839【Pa2013】Działka
题目描述
输入格式
输出格式
题解
- 和这里的方向处理有点略微不同;
- 可以用排序扫描线+线段树维护出矩形边框四个方向可以卡住的切点,从南逆时针记为:$Ns,Ne,Nn,Nw$;
- $O(n^2)A$处理出一个点沿四个象限伸展且横纵坐标均单调的凸包,并处理出从沿凸包从$A$走到$B$的叉积和;
- 沿着$Ns,Ne,Nn,Nw$绕一圈查询对应象限的叉积和就$O(1)$求出面积;
- 由于一三,二四象限一定不会有交集所以可以分别存在一起;
- 注意由于要维护叉积求凸包的排序要有优先级;
- 算了说不清楚,。。。,还是去看Claris的题解吧。。。。。。TAT
#include<bits/stdc++.h>
#define ll long long
#define il inline
#define ls (k<<1)
#define rs (k<<1|1)
using namespace std;
const int N=,M=;
int n,m,q,Ne[M],Nw[M],Nn[M],Ns[M],top,T[N];
int mx[M<<];
ll A[N][N],B[N][N];
struct poi{
int x,y,z,w;
poi(int _x=,int _y=,int _z=,int _w=):x(_x),y(_y),z(_z),w(_w){};
poi operator -(const poi&a){return poi(x-a.x,y-a.y);}
}P[N],Q[M],que[N];
struct data{int a,b,c,d;}D[M];
il bool cmp1(const poi&a,const poi&b){return a.x==b.x?a.y<b.y:a.x<b.x;}
il bool cmp2(const poi&a,const poi&b){return a.y==b.y?a.x>b.x:a.y<b.y;}
il bool cmpx(const poi&a,const poi&b){return /*a.x==b.x?a.y<b.y:*/a.x<b.x;}
il bool cmpy(const poi&a,const poi&b){return /*a.y==b.y?a.x>b.x:*/a.y<b.y;}
il char gc(){
static char*p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
il int rd(){
int x=; char c=gc();
while(c<''||c>'')c=gc();
while(c>=''&&c<=''){x=x*+c-'';c=gc();}
return x;
}
ll crs(poi a,poi b){return (ll)a.x*b.y-(ll)a.y*b.x;}
il int Max(int a,int b){return T[a]<T[b]?b:a;}
il int query(int k,int l,int r,int x,int y){
if(l==x&&r==y)return mx[k];
else {
int mid=(l+r)>>;
if(y<=mid)return query(ls,l,mid,x,y);
else if(x>mid)return query(rs,mid+,r,x,y);
else return Max(query(ls,l,mid,x,mid),query(rs,mid+,r,mid+,y));
}
}
il void update(int k,int l,int r,int x,int v){
if(l==r)mx[k]=v;
else{
mx[k]=v;
int mid=(l+r)>>;
if(x<=mid)update(ls,l,mid,x,v);
else update(rs,mid+,r,x,v);
}
}
void build(int k,int l,int r){
mx[k]=;
if(l==r){T[l]=;return;}
int mid=(l+r)>>;
build(ls,l,mid);
build(rs,mid+,r);
}
int main(){
freopen("bzoj3839.in","r",stdin);
freopen("bzoj3839.out","w",stdout);
n=rd(); m=rd();
for(int i=;i<=m;++i)P[i].x=rd(),P[i].y=rd(),P[i].z=i; sort(P+,P+m+,cmp1);
for(int i=;i<=m;++i){
que[top=]=P[i];
for(int j=i-;j;--j)if(P[j].y<=P[i].y){
while(top>&&crs(que[top]-que[top-],P[j]-que[top])<=)top--;
que[++top]=P[j];
A[P[i].z][P[j].z]=A[P[i].z][que[top-].z]+crs(que[top-],P[j]);
}
que[top=]=P[i];
for(int j=i+;j<=m;++j)if(P[j].y>=P[i].y){
while(top>&&crs(que[top]-que[top-],P[j]-que[top])<=)top--;
que[++top]=P[j];
A[P[i].z][P[j].z]=A[P[i].z][que[top-].z]+crs(que[top-],P[j]);
}
}
sort(P+,P+m+,cmp2);
for(int i=;i<=m;++i){
que[top=]=P[i];
for(int j=i-;j;--j)if(P[j].x>=P[i].x){
while(top>&&crs(que[top]-que[top-],P[j]-que[top])<=)top--;
que[++top]=P[j];
B[P[i].z][P[j].z]=B[P[i].z][que[top-].z]+crs(que[top-],P[j]);
}
que[top=]=P[i];
for(int j=i+;j<=m;++j)if(P[j].x<=P[i].x){
while(top>&&crs(que[top]-que[top-],P[j]-que[top])<=)top--;
que[++top]=P[j];
B[P[i].z][P[j].z]=B[P[i].z][que[top-].z]+crs(que[top-],P[j]);
}
} q=rd();for(int i=;i<=q;++i)D[i].a=rd(),D[i].b=rd(),D[i].c=rd(),D[i].d=rd(); sort(P+,P+m+,cmpx);
for(int i=;i<=q;++i)Q[i]=(poi){D[i].a,D[i].c,D[i].d,i};
sort(Q+,Q+q+,cmpx);
build(,,n);
for(int i=q,j=m;i;--i){
while(j&&P[j].x>=Q[i].x)T[P[j].z]=m-j+,update(,,n,P[j].y,P[j].z),j--;
Nw[Q[i].w]=query(,,n,Q[i].y,Q[i].z);
} for(int i=;i<=q;++i)Q[i]=(poi){D[i].b,D[i].c,D[i].d,i};
sort(Q+,Q+q+,cmpx);
build(,,n);
for(int i=,j=;i<=q;++i){
while(j<=m&&P[j].x<=Q[i].x)T[P[j].z]=j,update(,,n,P[j].y,P[j].z),j++;
Ne[Q[i].w]=query(,,n,Q[i].y,Q[i].z);
} sort(P+,P+m+,cmpy);
for(int i=;i<=q;++i)Q[i]=(poi){D[i].c,D[i].a,D[i].b,i};
sort(Q+,Q+q+,cmpx);
build(,,n);
for(int i=q,j=m;i;--i){
while(j&&P[j].y>=Q[i].x)T[P[j].z]=m-j+,update(,,n,P[j].x,P[j].z),j--;
Ns[Q[i].w]=query(,,n,Q[i].y,Q[i].z);
} for(int i=;i<=q;++i)Q[i]=(poi){D[i].d,D[i].a,D[i].b,i};
sort(Q+,Q+q+,cmpx);
build(,,n);
for(int i=,j=;i<=q;++i){
while(j<=m&&P[j].y<=Q[i].x)T[P[j].z]=j,update(,,n,P[j].x,P[j].z),j++;
Nn[Q[i].w]=query(,,n,Q[i].y,Q[i].z);
}
for(int i=;i<=q;++i){
ll ans = A[Ns[i]][Ne[i]] + B[Ne[i]][Nn[i]] + A[Nn[i]][Nw[i]] + B[Nw[i]][Ns[i]];
// printf("%lld %lld %lld %lld\n",A[Nn[i]][Nw[i]],B[Ne[i]][Nn[i]],B[Nw[i]][Ns[i]],A[Ns[i]][Ne[i]]);
// printf("%d %d %d %d\n",Nn[i],Nw[i],Ns[i],Ne[i]);
printf("%.1lf\n",ans/2.0);
}
return ;
}
bzoj3839
bzoj3839【Pa2013】Działka的更多相关文章
- 【PA2013】【BZOJ3733】Iloczyn
Description 给定正整数n和k,问是否能将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示測试组数 接下来T行每行两个数n(n<=10^9),k(k ...
- 【BZOJ3733】[Pa2013]Iloczyn (搜索)
[BZOJ3733][Pa2013]Iloczyn (搜索) 题面 BZOJ 题解 把约数筛出来之后,直接爆搜,再随便剪枝就过了. 最近一句话题解倾向比较严重 #include<iostream ...
- 【BZOJ3837】[Pa2013]Filary 随机化神题
[BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...
- 【BZOJ3837】[PA2013]Filary
[BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合 ...
- 【TYVJ1864】[Poetize I]守卫者的挑战 概率与期望
[TYVJ1864][Poetize I]守卫者的挑战 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过."我 ...
- 【bzoj1027】合金
[bzoj1027]合金 分析 数形结合+计算几何+Floyd最小环. http://blog.csdn.net/popoqqq/article/details/40539273 虽然这样占大家的很不 ...
- 【动态规划】HDU 5492 Find a path (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意: 一个N*M的矩阵,一个人从(1,1)走到(N,M),每次只能向下或向右走.求(N+ ...
- 【模拟】Codeforces 671B Robin Hood
题目链接: http://codeforces.com/problemset/problem/671/B 题目大意: N个人,每个人有Ci钱,现在有一个人劫富济贫,从最富的人之一拿走1元,再给最穷的人 ...
- 【WC2001】【cogs358】高性能计算机(动态规划)
[WC2001][cogs358]高性能计算机(动态规划) ##题面 [问题描述] 现在有一项时间紧迫的工程计算任务要交给你--国家高性能并行计算机的主管工程师--来完成.为了尽可能充分发挥并行计算机 ...
随机推荐
- gcc 与 g++的区分较
一:gcc与g++比较 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为 ...
- PHP中 post方法 与 get方法 的区别
1.Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如[url]http://www.domain.co ...
- 【quickhybrid】组件(自定义)API的实现
前言 前文在API规划时就已经有提到过组件API这个概念,本文将会介绍它的原理以及实现 理解组件API这个概念 quick.ui.xxx quick.page.xxx 在quick hybrid中,A ...
- C++ 函数 函数的重载 有默认参数的函数
函数的重载 C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同.这就是函数的重载(function overloading). int max1(int a,int b, int c ...
- CF 1064B Equations of Mathematical Magic(思维规律)
Description Colossal! — exclaimed Hawk-nose. — A programmer! That's exactly what we are looking for. ...
- Beta阶段版本控制报告
版本控制代码及文档要求 在coding.net版本控制; 公开项目,教师.专家.其他同学可以不注册源代码.在此公布git地址. 报告beta阶段2周中,项目的版本控制情况,不包括未在coding.ne ...
- 软件共享平台的NABCD
Need: 我感觉我们这个软件很适合现在的大学生,特别是大一大二的学生,由于在大学里面学生都在各忙各的,学生遇到问题如果自己在网上查找,这就需要花费大量的时间,如果有了这个软件学生和老师都可以在这个平 ...
- 《构建之法》第8,9,10章读后感&sprint1个人总结
第8章 这一章主要介绍需求分析.具体说明了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术.需求分析是决定一个软件的使用 ...
- 理解RESTful架构【转】
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- 在服务器搭建Jupyter notebook
安装 Jupyter Notebook (这里虽然是对centos和Python2的,但是在Ubuntu16.04,Python3同样可以照着弄) Jupyter Notebook 简介 Jupyte ...