题意

平面上有\(n\)个点\(A_i\),\(q\)次询问,每次给出一个点\(P\),求:

\[\sum_{i=L}^{R} 2S_{\triangle OPA_i}
\]

最大值,其中$S_{\triangle_{ABC}} \ = \ \frac{\vec{AB}\times\vec{AC} }{2} $为三角形的有向面积

$1 \le n \le 10^5 \ , \ 1 \le q \le 10^6 $

题解

  • 求出\(n^2\)个区间点和,求出他们构成的凸包

  • 对于一个询问向量\((A,B)\),最优的点就是\((-A,-B)\)卡住的点(此时整个凸包在它左手边)

  • 对于所有询问可以旋转卡壳\(O(q+n)\)完成

  • 考虑如何求\(n^2\)个区间点和构成的凸包

  • 对区间分治:考虑区间\([l,r]\) : 从\(mid\)向左做点后缀和,向右做点前缀和

  • 对两边分别求凸包做\(minkowski\)和就得到了跨越\(mid\)区间点和的凸包,分治下去

  • 这样得到的候选点的个数是\(n log \ n\)的,最后作一次总凸包

  • 时间复杂度\(O(n \log ^2 n + q)\)

    #include<bits/stdc++.h>
    #define il inline
    #define rg register
    #define ll long long using namespace std;
    const int N=2000010; int n,m,tot,tp;ll ans[N];
    struct P{
    ll x,y,z;
    P(ll _x=0,ll _y=0,ll _z=0):x(_x),y(_y),z(_z){};
    P operator +(const P&a)const{return P(x+a.x,y+a.y);}
    P operator -(const P&a)const{return P(x-a.x,y-a.y);}
    bool operator <(const P&a)const{return x==a.x?y<a.y:x<a.x;}
    void rev(){x=-x,y=-y;}
    }p[N],q[N],L[N],R[N],S[N],st[N];
    ll crs(P a,P b){return a.x*b.y-a.y*b.x;} void chkmin(ll&x,ll y){if(x>y)x=y;}
    void chkmax(ll&x,ll y){if(x<y)x=y;} char gc(){
    static char*p1,*p2,s[1000000];
    if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    int rd(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=gc();}
    return x*f;
    }
    char ps[1000000],*pp=ps;
    void flush(){fwrite(ps,1,pp-ps,stdout);pp=ps;}
    void push(char x){if(pp==ps+1000000)flush();*pp++=x;}
    void write(ll x){
    static int sta[20],top;
    if(x<0)push('-'),x=-x;
    if(!x){push('0');push('\n');return;}
    while(x)sta[++top]=x%10,x/=10;
    while(top)push(sta[top--]^'0');
    push('\n');
    } void convex(P*A,int&cnt){
    if(cnt==1){A[2]=A[1];return;}
    sort(A+1,A+cnt+1);
    st[tp=1]=A[1];
    for(int i=2;i<=cnt;++i){
    while(tp>1 && crs(st[tp]-st[tp-1],A[i]-st[tp])<=0 )tp--;
    st[++tp]=A[i];
    }
    int now=tp;
    for(int i=cnt-1;i;--i){
    while(tp>now && crs(st[tp]-st[tp-1],A[i]-st[tp])<=0 )tp--;
    st[++tp]=A[i];
    }
    cnt=0;
    for(int i=1;i<=tp;++i)if(!cnt||(st[i].x!=A[cnt].x||st[i].y!=A[cnt].y))A[++cnt]=st[i];
    cnt--;
    } void minkow(P*A,int cnt1,P*B,int cnt2){
    int j=1;
    for(int i=1;i<=cnt1;++i){
    S[++tot]=A[i]+B[j];
    P now=A[i+1]-A[i];
    while(j<=cnt2&&crs(B[j+1]-B[j],now)>=0)S[++tot]=A[i]+B[++j];
    }
    while(j<=cnt2)S[++tot]=A[1]+B[j++];
    } void solve(int l,int r){
    if(l==r){S[++tot]=p[l];return;}
    int mid=(l+r)>>1,cnt1=0,cnt2=0;
    L[++cnt1]=R[++cnt2]=P(0,0);
    for(int i=mid;i>=l;--i)++cnt1,L[cnt1]=L[cnt1-1]+p[i];
    for(int i=mid+1;i<=r;++i)++cnt2,R[cnt2]=R[cnt2-1]+p[i];
    convex(L,cnt1);convex(R,cnt2);
    minkow(L,cnt1,R,cnt2);
    solve(l,mid);solve(mid+1,r);
    } bool cmp(P a,P b){
    return crs(a,b)>0;
    //return atan2(a.y,a.x)<atan2(b.y,b.x);
    }
    void calc(){
    sort(q+1,q+m+1,cmp);
    int j=1,hd=1;while(!q[hd].x&&!q[hd].y)++hd;
    //while(tot>1&&crs(q[hd],S[j%tot+1]-S[j])<=0)j=j%tot+1;
    for(int i=1;i<=tot;++i)if(crs(q[hd],S[i]-S[j])<0)j=i;
    for(int i=1;i<=m;++i){
    if(!q[i].x&&!q[i].y)continue;
    while(tot>1&&crs(q[i],S[j%tot+1]-S[j])<=0)j=j%tot+1;
    ans[q[i].z]=-crs(q[i],S[j]);
    }
    }
    //查询答案的时候注意细节, 存在(0,0).......
    int main(){
    freopen("area.in","r",stdin);
    freopen("area.out","w",stdout);
    n=rd(),m=rd();
    for(int i=1;i<=n;++i)p[i].x=rd(),p[i].y=rd();
    int tmp=0;
    for(int i=1;i<=m;++i){
    q[++tmp].x=-rd(),q[tmp].y=-rd(),q[tmp].z=i;
    if(!q[tmp].x&&!q[tmp].y)tmp--;
    }
    swap(tmp,m);
    solve(1,n);
    convex(S,tot);
    calc();
    for(int i=1;i<=tmp;++i)write(ans[i]);
    return flush(),0;
    }
    //

【JZOJ6217】【20190614】最大面积的更多相关文章

  1. C语言 · 矩形面积交

    问题描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入格式 输入仅包含两行,每行描述一个矩形. 在每行中 ...

  2. 计算照片的面积(WPF篇)

    昨天,老周突发其想地给大伙伴们说了一下UWP应用中计算照片面积的玩法,而且老周也表示会提供WPF版本的示例.所以,今天就给大伙们补上吧. WPF是集成在.net框架中,属于.net的一部分,千万不要跟 ...

  3. 计算照片的面积(UWP篇)

    今天先说UWP应用程序上计算照片面积的方法,改天有空,再说说WPF篇. 其实计算照片面积的原理真TMD简单,只要你有本事读到照片的像素高度和宽度,以及水平/垂直方向上的分辨率(DPI)就可以了.计算方 ...

  4. arcgis 按面积分割, 按比例分割面积,按等份批量面积分割工具

    arcgis 按面积分割, 按比例分割面积,按等份批量面积分割工具 视频下载:https://yunpan.cn/cvujkpKIqwccn  访问密码 e9f4

  5. [LeetCode] Rectangle Area 矩形面积

    Find the total area covered by two rectilinear rectangles in a2D plane. Each rectangle is defined by ...

  6. 求两圆相交部分面积(C++)

    已知两圆圆心坐标和半径,求相交部分面积: #include <iostream> using namespace std; #include<cmath> #include&l ...

  7. 【数据挖掘】朴素贝叶斯算法计算ROC曲线的面积

    题记:          近来关于数据挖掘学习过程中,学习到朴素贝叶斯运算ROC曲线.也是本节实验课题,roc曲线的计算原理以及如果统计TP.FP.TN.FN.TPR.FPR.ROC面积等等.往往运用 ...

  8. 面积(area)

    题目描述 编程计算由"*"号围成的下列图形的面积.面积计算方法是统计*号所围成的闭合曲线中点的数目.如图所示,在10*10的二维数组中,“*”围住了15个点,因此面积为15. 0 ...

  9. 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵

    题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下 ...

随机推荐

  1. Maven的仓库和settings.xml配置文件

    (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/83549846冷血之心的博客) 快速导航: Maven基础概念和安 ...

  2. Java单元测试 Http Server Mock框架选型

    背景动机 某期优化需要针对通用的HttpClient封装组件--HttpExecutor在保证上层暴露API不动的前提做较多改动,大致包括以下几点: apache http client 版本升级 H ...

  3. Kafka学习笔记(三)——架构深入

    之前搭建好了Kafka的学习环境,了解了具体的配置文件内容,并且测试了生产者.消费者的控制台使用方式,也学习了基本的API.那么下一步,应该学习一下具体的内部流程~ 1.Kafka的工作流程 大致的工 ...

  4. ELK学习笔记之Logstash不停机自动重载配置文件

    0x00 自动重新加载配置 为了可以自动检测配置文件的变动和自动重新加载配置文件,需要在启动的时候使用以下命令: ./bin/lagstash -f configfile.conf --config. ...

  5. :阿里巴巴 Java 开发手册 (十一)工程结构

    (一) 应用分层 1. [推荐]图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于 Web 层,也可以直接依赖于 Service 层,依此类推:  开放接口层:可直接封装 Se ...

  6. 在Centos7中创建.net core 项目,并用Apache做代理服务器部署.net core项目

    这一篇实例记录一次用Centos7创建并部署.net core项目的过程,希望能帮到用到的小伙伴. Kestrel 是 ASP.NET Core 项目模板中包括的默认 Web 服务器,Kestrel可 ...

  7. 在Centos中安装.net core SDK

    在Linux中运行.net core 项目必须要有.net core SDK 环境.之前配置过几次,但由于没有做总结.过了几天又配置的时候 感觉特别陌生,今天就记录一次.net core SDK 的安 ...

  8. dump net core windbg 内存分析

    !dumpheap -stat //检查当前所有托管类型的统计信息 0:000> !dumpheap -stat //检查当前所有托管类型的统计信息 .... 00007ffdb9387a98 ...

  9. 2019-07-25 PDO

    PDO是什么? pdo是php数据对象,即php data object .使用pdo是为了让我们能够使用相同的代码连接不同的数据库.PDO扩展是以面向对象的方式来进行封装,也就是说,我们的PDO扩展 ...

  10. 计算机网络基础之IP地址详解

    计算机网络基础之IP地址详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IP地址概述 1>.什么是IP地址 我们为什么要使用逻辑地址(IP地址)来标识网络设备,而不采 ...