对于每个询问,首先可以通过扫描线+线段树求出四个方向的第一个点,询问范围等价于框住这些点的最小矩形。

对于一个点$i$,预处理出:

$A[i][j]$:$i$往左下角按凸壳走到$j$时,凸壳上相邻两点的叉积和。

$B[i][j]$:$i$往右下角按凸壳走到$j$时,凸壳上相邻两点的叉积和。

$C[i][j]$:$i$往左上角按凸壳走到$j$时,凸壳上相邻两点的叉积和。

$D[i][j]$:$i$往右上角按凸壳走到$j$时,凸壳上相邻两点的叉积和。

注意到每个数组只有一半有用,所以可以把$AD$合并、$BC$合并。

那么答案相当于在$4$个边界点上按凸包走一圈的叉积和再除以二,如下图,这可以$O(1)$计算。

时间复杂度$O(n^2+m\log m)$。

#include<cstdio>
#include<algorithm>
using std::sort;
typedef long long ll;
const int N=3005,M=1000010;
int K,n,m,i,j,k,t,q[N];ll A[N][N],B[N][N],ans;
struct P{
int x,y,p;
inline ll operator*(const P&b){return 1LL*x*b.y-1LL*y*b.x;}
}a[N];
inline bool cmpA(const P&a,const P&b){return a.x==b.x?a.y<b.y:a.x<b.x;}
inline bool cmpB(const P&a,const P&b){return a.x==b.x?a.y>b.y:a.x<b.x;}
inline bool cmpx(const P&a,const P&b){return a.x<b.x;}
inline bool cmpy(const P&a,const P&b){return a.y<b.y;}
struct Q{
int a,b,c,d;
Q(){}
Q(int _a,int _b,int _c,int _d){a=_a,b=_b,c=_c,d=_d;}
}que[M],e[M];
int NA[M],NB[M],NC[M],ND[M];
inline bool cmpE(const Q&a,const Q&b){return a.a<b.a;}
int T[2100000],vis[N],pos;
void build(int x,int a,int b){
T[x]=0;
if(a==b)return;
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
void change(int x,int a,int b,int c,int p){
T[x]=p;
if(a==b)return;
int mid=(a+b)>>1;
if(c<=mid)change(x<<1,a,mid,c,p);else change(x<<1|1,mid+1,b,c,p);
}
inline int merge(int x,int y){return vis[x]>vis[y]?x:y;}
int ask(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return T[x];
int mid=(a+b)>>1,t=0;
if(c<=mid)t=ask(x<<1,a,mid,c,d);
if(d>mid)t=merge(t,ask(x<<1|1,mid+1,b,c,d));
return t;
}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int main(){
read(K),read(n);
for(i=1;i<=n;i++)read(a[i].x),read(a[i].y),a[i].p=i;
sort(a+1,a+n+1,cmpA);
for(i=2;i<=n;i++){
k=a[q[t=0]=i].p;
for(j=i-1;j;j--)if(a[j].y<=a[i].y){
while(t&&1LL*(a[q[t-1]].x-a[q[t]].x)*(a[q[t]].y-a[j].y)<1LL*(a[q[t]].x-a[j].x)*(a[q[t-1]].y-a[q[t]].y))t--;
A[k][a[j].p]=A[k][a[q[t]].p]+a[q[t]]*a[j];
q[++t]=j;
}
}
for(i=1;i<n;i++){
k=a[q[t=0]=i].p;
for(j=i+1;j<=n;j++)if(a[j].y>=a[i].y){
while(t&&1LL*(a[q[t]].x-a[q[t-1]].x)*(a[j].y-a[q[t]].y)<1LL*(a[j].x-a[q[t]].x)*(a[q[t]].y-a[q[t-1]].y))t--;
A[k][a[j].p]=A[k][a[q[t]].p]+a[q[t]]*a[j];
q[++t]=j;
}
}
sort(a+1,a+n+1,cmpB);
for(i=1;i<n;i++){
k=a[q[t=0]=i].p;
for(j=i+1;j<=n;j++)if(a[j].y<=a[i].y){
while(t&&1LL*(a[q[t]].x-a[q[t-1]].x)*(a[j].y-a[q[t]].y)>1LL*(a[j].x-a[q[t]].x)*(a[q[t]].y-a[q[t-1]].y))t--;
B[k][a[j].p]=B[k][a[q[t]].p]+a[q[t]]*a[j];
q[++t]=j;
}
}
for(i=2;i<=n;i++){
k=a[q[t=0]=i].p;
for(j=i-1;j;j--)if(a[j].y>=a[i].y){
while(t&&1LL*(a[q[t-1]].x-a[q[t]].x)*(a[q[t]].y-a[j].y)>1LL*(a[q[t]].x-a[j].x)*(a[q[t-1]].y-a[q[t]].y))t--;
B[k][a[j].p]=B[k][a[q[t]].p]+a[q[t]]*a[j];
q[++t]=j;
}
}
read(m);
for(i=1;i<=m;i++)read(que[i].a),read(que[i].b),read(que[i].c),read(que[i].d);
for(i=1;i<=m;i++)e[i]=Q(que[i].d,que[i].a,que[i].b,i);
sort(a+1,a+n+1,cmpy),sort(e+1,e+m+1,cmpE);
for(build(1,0,K),i=j=1;i<=m;i++){
while(j<=n&&a[j].y<=e[i].a)change(1,0,K,a[j].x,a[j].p),vis[a[j].p]=++pos,j++;
NA[e[i].d]=ask(1,0,K,e[i].b,e[i].c);
}
for(i=1;i<=m;i++)e[i]=Q(que[i].c,que[i].a,que[i].b,i);
sort(a+1,a+n+1,cmpy),sort(e+1,e+m+1,cmpE);
for(build(1,0,K),i=m,j=n;i;i--){
while(j&&a[j].y>=e[i].a)change(1,0,K,a[j].x,a[j].p),vis[a[j].p]=++pos,j--;
NC[e[i].d]=ask(1,0,K,e[i].b,e[i].c);
}
for(i=1;i<=m;i++)e[i]=Q(que[i].b,que[i].c,que[i].d,i);
sort(a+1,a+n+1,cmpx),sort(e+1,e+m+1,cmpE);
for(build(1,0,K),i=j=1;i<=m;i++){
while(j<=n&&a[j].x<=e[i].a)change(1,0,K,a[j].y,a[j].p),vis[a[j].p]=++pos,j++;
ND[e[i].d]=ask(1,0,K,e[i].b,e[i].c);
}
for(i=1;i<=m;i++)e[i]=Q(que[i].a,que[i].c,que[i].d,i);
sort(a+1,a+n+1,cmpx),sort(e+1,e+m+1,cmpE);
for(build(1,0,K),i=m,j=n;i;i--){
while(j&&a[j].x>=e[i].a)change(1,0,K,a[j].y,a[j].p),vis[a[j].p]=++pos,j--;
NB[e[i].d]=ask(1,0,K,e[i].b,e[i].c);
}
for(i=1;i<=m;i++){
ans=A[NA[i]][NB[i]]-B[NA[i]][ND[i]]-B[NC[i]][NB[i]]+A[NC[i]][ND[i]];
printf("%lld.%d\n",ans>>1LL,ans&1LL?5:0);
}
return 0;
}

  

BZOJ3839 : [Pa2013]Działka的更多相关文章

  1. bzoj3839【Pa2013】Działka

    题目描述 平面上有n个不重复的点.每次询问一个边平行坐标轴的矩形内(包含边界)的点组成的凸包的面积.. 输入格式 第一行两个整数k,n(1<=k<=1000000,3<=n<= ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang

    Ka Chang 思路: dfs序+树状数组+分块 先dfs处理好每个节点的时间戳 对于每一层,如果这一层的节点数小于sqrt(n),那么直接按照时间戳在树状数组上更新 如果这一层节点个数大于sqrt ...

  4. 补交第二周作业:学习ka li

    在老师给的虚拟机上安装,试了n次都没有安装成功,百度上的说法也是众说纷纭. 之后重新安装了另一个版本的虚拟机,按照教程成功装上了ka li. 一. 安装VMtools:是为了方便宿主机与虚拟机间的文件 ...

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

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

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

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

  7. 【BZOJ3837】[PA2013]Filary

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

  8. KA,连接池居然这么简单? 原创: 58沈剑 架构师之路 3月20日

    KA,连接池居然这么简单? 原创: 58沈剑 架构师之路 3月20日

  9. Ka/ Ks|同义替换的三种路径|kaks_Calculator|

    生命组学 研究old gene 和 young gene CAI选择信号:CGmutation信号 Neutrality plot:CG3与GC1.GC2的关系:平:mutation:正相关:sele ...

随机推荐

  1. 破解TP-Link路由-嗅探PPPoE拨号密码

    如果你平时都使用路由器直接上网,那么你还记得你的宽带(ADSL)帐户名和密码吗?忘记密码后又该如何找回呢?别急,本文带你一同找回遗忘的ADSL密码.1.安全性较差的路由器(例如腾达的某些路由器):这里 ...

  2. FireFox下上传控件的显示问题

    Chrome正常 FireFox显示不正常 上传控件一直有个问题,就是样式问题,解决方法就是用一个大的背景层挡住,然后点大的背景层去触发上传控件的Click事件. Html: <span id= ...

  3. coco2dx实现翻拍效果

    昨天吃饭看见同事演示他做的翻牌效果,感觉不错,我心血来潮也来搞个,很简单直接上代码. class FlipCard : public CCNode { public: CREATE_FUNC(Flip ...

  4. php扩展开发初探

    2015年2月26日 15:44:41 原因: 想用PHP实现一个布隆过滤器算法, 其中要用到位运算, 但是PHP的内置的int类型不给力, 不能支持大整数的位运算 数据一旦太大, 就会变为浮点数表示 ...

  5. canvas API ,通俗的canvas基础知识(三)

    全文说到了三角形,圆形等相关图形的画法,不熟悉的同学可以出门右转,先看看前文,接下来继续我们的图形——曲线. 学过数学,或者是比较了解js 的同学都知道贝塞尔曲线,当然,在数学里面,这是一门高深的学问 ...

  6. codeforces 478B Random Teams 解题报告

    题目链接:http://codeforces.com/problemset/problem/478/B 题目意思:有 n 个人,需要将这班人分成 m 个 组,每个组至少含有一个人,同一个组里的人两两可 ...

  7. Html标签<a>的target属性

    target属性规定了在何处打开超链接的文档. 如果在一个 <a> 标签内包含一个 target 属性,浏览器将会载入和显示用这个标签的 href 属性命名的.名称与这个目标吻合的框架或者 ...

  8. C++多线程下的单例模式

    一.懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例. 需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread s ...

  9. hrbustoj 1161:Leyni(树状数组练习)

    LeyniTime Limit: 3000 MS Memory Limit: 65536 KTotal Submit: 260(59 users) Total Accepted: 80(55 user ...

  10. google地图引入网页

    <script src=);//指定坐标,缩放级别,setcenter 设置地图中心位置             //var mapControl = new GMapTypeControl() ...