题目描述

平面上有n个不重复的点。每次询问一个边平行坐标轴的矩形内(包含边界)的点组成的凸包的面积。、

输入格式

第一行两个整数k,n(1<=k<=1000000,3<=n<=3000)。
接下来n行,每行两个整数x_i,y_i(0<=x_i,y_i<=k),表示点的坐标。
接下来一行一个整数m(1<=m<=1000000),表示询问数量。
接下来m行,每行四个整数a,b,c,d(0<=a<b<=k,0<=c<d<=k),表示询问的矩形范围为a<=x<=b,c<=y<=d。

输出格式

对于每个询问输出一行表示面积。保留小数点后一位。

  • 题解

    • 这里的方向处理有点略微不同;
    • 可以用排序扫描线+线段树维护出矩形边框四个方向可以卡住的切点,从南逆时针记为:$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的更多相关文章

  1. 【PA2013】【BZOJ3733】Iloczyn

    Description 给定正整数n和k,问是否能将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示測试组数 接下来T行每行两个数n(n<=10^9),k(k ...

  2. 【BZOJ3733】[Pa2013]Iloczyn (搜索)

    [BZOJ3733][Pa2013]Iloczyn (搜索) 题面 BZOJ 题解 把约数筛出来之后,直接爆搜,再随便剪枝就过了. 最近一句话题解倾向比较严重 #include<iostream ...

  3. 【BZOJ3837】[Pa2013]Filary 随机化神题

    [BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...

  4. 【BZOJ3837】[PA2013]Filary

    [BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合 ...

  5. 【TYVJ1864】[Poetize I]守卫者的挑战 概率与期望

    [TYVJ1864][Poetize I]守卫者的挑战 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过."我 ...

  6. 【bzoj1027】合金

    [bzoj1027]合金 分析 数形结合+计算几何+Floyd最小环. http://blog.csdn.net/popoqqq/article/details/40539273 虽然这样占大家的很不 ...

  7. 【动态规划】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+ ...

  8. 【模拟】Codeforces 671B Robin Hood

    题目链接: http://codeforces.com/problemset/problem/671/B 题目大意: N个人,每个人有Ci钱,现在有一个人劫富济贫,从最富的人之一拿走1元,再给最穷的人 ...

  9. 【WC2001】【cogs358】高性能计算机(动态规划)

    [WC2001][cogs358]高性能计算机(动态规划) ##题面 [问题描述] 现在有一项时间紧迫的工程计算任务要交给你--国家高性能并行计算机的主管工程师--来完成.为了尽可能充分发挥并行计算机 ...

随机推荐

  1. 新手Python第一天(接触)

    Python 变量 Python的变量由字母,数字,下划线组成不包含特殊字符,不能以数字开头 可以使用的名称 例如:name,name2,my_name 不可使用的名称 例如:if...(Python ...

  2. 【python 3.6】类:访问属性及调用方法

    >>> class price(): //定义1个类,用于计算价格 def __init__(self,name,danjia): //初始化方法,定义商品名称和单价 self.na ...

  3. CentOS 7 安装图形化界面及 Xshell 连接

    CentOS 比较适合用作服务器的系统,之前用过 CentOS 6,但是在配置 Nginx 的时候,发现很多语句版本7的系统都进行了更新,而且网上针对版本7的例子会更多一下,遂将系统换成版本7. 下载 ...

  4. Python 中的一些小技巧

    这里是本人收集的一些 Python 小技巧,目前主要是一些实用函数,适合有一定基础的童鞋观看(不会专门介绍使用到的标准库函数).. 一.函数式编程 函数式编程用来处理数据,感觉很方便.(要是再配上管道 ...

  5. 软件工程-东北师大站-第十二次作业(PSP)

    1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图

  6. 互评Alpha版本—SkyHunter

    1.根据NABCD评论作品:   N(Need,需求):飞机大战题材的游戏对80,90后的人来说算是童年的记忆,可以在闲暇之余打开电脑玩一会儿.但是面向初中生,高中生的话这种PC小游戏可能不会那么适合 ...

  7. java 实验一

       步骤 耗时h 百分比% 需求分析 0.3h 7.5 设计 2.5h 62.5 代码实现 0.5h 12.5 测试 0,2h 5 分析总结 0.5h 12.5 实验一 截图 实验二: 实验三 实现 ...

  8. Maven3 用Maven创建第一个web项目(2)servlet演示

    上一章用Maven新建了web项目成功后,本文演示在此基础上应用servlet. 1.首先修改pom.xml文件,添加servlet依赖 <project xmlns="http:// ...

  9. Linux上多次restore Tensorflow模型报错

    环境:python3,tensotflow 在恢复了预先训练好的模型进行预测时,第一次是能够成功执行的,但我多次restore模型时,出现了以下问题: 1.ValueError: Variable c ...

  10. Delphi判断字符串中是否包含汉字,并返回汉字位置

    //1,函数代码{判断字符串是否包含汉字// judgeStr:要判断的字符串//posInt:第一个汉字位置}function TForm2.IsHaveChinese(judgeStr: stri ...