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]高性能计算机(动态规划) ##题面 [问题描述] 现在有一项时间紧迫的工程计算任务要交给你--国家高性能并行计算机的主管工程师--来完成.为了尽可能充分发挥并行计算机 ...
随机推荐
- Codeforces1084 | Round526Div2 | 瞎讲报告
目录 A. The Fair Nut and Elevator B.Kvass and the Fair Nut C.The Fair Nut and String D.The Fair Nut an ...
- lsblk命令详解
基础命令学习目录首页 lsblk 默认是树形方式显示: $lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 2. ...
- 安装macOS Sierra后怎么找回“任何来源”选项
安装macOS Sierra后,会发现系统偏好设置的“安全与隐私”中默认已经去除了允许“任何来源”App的选项,无法运行一些第三方应用(提示xx.app已经损坏).如果需要恢复允许“任何来源”的选项, ...
- 解决maven update project 后项目jdk变成1.5
http://blog.csdn.net/jay_1989/article/details/52687934
- 第九次作业psp
psp 进度条 代码累积折线图 博文累积折线图 psp饼状图
- JAVA第一次实验 ——凯撒密码的实现
JAVA实验一 编写程序实现凯撒密码 201352330 潘俊洋 一.实验说明 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加 ...
- KMP算法之next数组的求解思路
2.next数组的求解思路 本部分内容转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algo ...
- 第二阶段Sprint冲刺会议2
进展:讨论主界面布局,跳转界面的布局,查看有关页面跳转的资料及示例代码并试着编写.
- 1001.A+B Format (20)的感受
这是提交到Github的object-oriented文件夹里面的代码:https://github.com/sonnypp/object-oriented/tree/master/1001. 一.解 ...
- iOS UIView性能最优的设计圆角并且绘制边框颜色
//以给cell切圆角为例- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollection ...