题目描述

平面上有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. 织梦调用多个栏目typeid="1,2,3"不支持的解决方法

    织梦arclist调用副栏目不显示的解决办法: 打开/include/taglib/arclist.lib.php,代码约位于295-296行,查找以下两行代码: if($CrossID=='') $ ...

  2. PHP has encountered an Access Violation at 01F4A622解决方法

    php搭建的网站出现以下问题的解决方法分享: Z-blog,DedeCMS,Dsicuz!,PhpWind,PhpCMS,帝国CMS等都有可能出现php访问冲突问题. 今天访问网站发现出现了一个错误& ...

  3. impala 使用记录

    在命令行里面直接输入类似下面的语句,就可以执行impala sql语句. impala-shell -q "select * from xxxc limit 10;" 当用pyth ...

  4. 基于Linux-3.9.4内核增加简单的时间片轮转功能

    简单的时间片轮转多道程序内核代码 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 作者:sa18225465 一.安装 Linux-3.9.4 ...

  5. [zabbix] zabbix从内部检测web页面

    环境说明: 两台机器各运行一个tomcat实例,通过阿里云slb到后端,假设后端服务挂了一个,从外部访问整个服务还是可用的,所以需要从内部检测web页面. zabbix自带的web场景都是从外部检测w ...

  6. flume handler

    1.classpath classpath中需要这两项:Flume Agent configuration file and the second are the Flume client jars ...

  7. Beta阶段中间产物【欢迎来怼】

    一.版本控制 ①Git地址:https://git.coding.net/tianjiping/Android-tianjiping.git ②check in次数:7次. ③成员代码贡献 因为阚博文 ...

  8. bootstrap table的展开行问题

    照着网上与api里说的添加detailView属性设置为true,detailFormatter属性为展开后的内容,但是设置之后发现,在表格每一行最前面是多出一列正常该显示"+"的 ...

  9. Scrum Meeting 7 -2014.11.13

    之前srcum没写好是我的错.以后会每天更新的. 老师反映之前项目小组从pdf中提取作者效果不好,我们讨论决定进行一定的优化.在整合测试的同时开始服务器程序部署. Member Today’s tas ...

  10. 第二阶段Sprint冲刺会议1

    进展:总结第一阶段冲刺成就,讨论第二阶段任务,要实现的主要功能,分工及任务认领.