传送门

题意:动态插入点,维护凸包面积。


思路:用setsetset维护极角序来支持面积查询即可。

然后注意选原点的时候要从初始三个点随机平均系数来避免精度误差。

代码:

#include<bits/stdc++.h>
#define ri register ll
using namespace std;
typedef long long ll;
inline ll read(){
    ll ans=0;
    bool f=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f^=1;ch=getchar();}
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return f?ans:-ans;
}
struct pot{
    ll x,y;
    double ang;
    pot(ll _x=0,ll _y=0):x(_x),y(_y){}
    pot(ll _x,ll _y,double _ang):x(_x),y(_y),ang(_ang){}
    friend inline pot operator+(const pot&a,const pot&b){return pot(a.x+b.x,a.y+b.y);}
    friend inline pot operator-(const pot&a,const pot&b){return pot(a.x-b.x,a.y-b.y);}
    friend inline ll operator^(const pot&a,const pot&b){return (ll)a.x*b.y-(ll)a.y*b.x;}
    friend inline bool operator<(const pot&a,const pot&b){return a.ang<b.ang;}
}a[5];
set<pot>S;
typedef set<pot>::iterator It;
ll n;
ll ans=0;
inline ll Area(const pot&a,const pot&b,const pot&c){return (a-c)^(b-c);}
inline ll labs(const ll&x){return x>0?x:-x;}
inline pot Pre(const pot&now){
    if(S.count(now)>0)return now;
    It it=S.lower_bound(now);
    if(it==S.begin())it=S.end();
    return *(--it);
}
inline pot Suf(const pot&now){
    It it=S.upper_bound(now);
    if(it==S.end())it=S.begin();
    return *it;
}
inline bool check(const pot&x){return Area(x,Suf(x),Pre(x))<=0;}
inline void insert(const pot&x){
    if(check(x))return;
    ans+=labs(Area(x,Suf(x),Pre(x)));
    while(1){
        pot p1=Pre(x),p2;
        S.erase(p1);
        p2=Pre(x);
        if(Area(x,p2,p1)>=0){S.insert(p1);break;}
        ans+=labs(Area(x,p2,p1));
    }
    while(1){
        pot p1=Suf(x),p2;
        S.erase(p1);
        p2=Suf(x);
        if(Area(x,p2,p1)<=0){S.insert(p1);break;}
        ans+=labs(Area(p1,p2,x));
    }
    S.insert(x);
}
signed main(){
    srand(time(NULL));
    ll xxx=rand(),yyy=rand(),zzz=rand(),ttt=xxx+yyy+zzz;
    double X,Y;
    a[1].x=read(),a[1].y=read();
    a[2].x=read(),a[2].y=read();
    a[3].x=read(),a[3].y=read();
    X=(double)((ll)a[1].x*xxx+(ll)a[2].x*yyy+(ll)a[3].x*zzz)/ttt;
    Y=(double)((ll)a[1].y*xxx+(ll)a[2].y*yyy+(ll)a[3].y*zzz)/ttt;
    for(ri i=1;i<=3;++i)S.insert(pot(a[i].x,a[i].y,atan2(a[i].y-Y,a[i].x-X)));
    ans=labs(Area(a[1],a[2],a[3]));
    for(ri x,y,tt=read();tt;--tt){
        x=read(),y=read();
        insert(pot(x,y,atan2(y-Y,x-X)));
        cout<<ans<<'\n';
    }
    return 0;
}

2019.02.21 bzoj1249: SGU277 HERO 动态凸包(set+凸包)的更多相关文章

  1. bzoj1249: SGU277 HERO 动态凸包

    动态维护凸包面积. //Achen #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);i++) #def ...

  2. 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)

    传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...

  3. 2019.02.21 bzoj5317: [Jsoi2018]部落战争(凸包+Minkowski和)

    传送门 题意:qqq次询问把一个凸包整体加一个向量(x,y)(x,y)(x,y)之后是否与另外一个凸包相交. 思路:转化一下发现只要会求A+B={v⃗=a⃗+b⃗∣a⃗∈A,b⃗∈B}A+B=\{\v ...

  4. 2019.02.21 bzoj2829: 信用卡凸包(凸包)

    传送门 题意:给nnn个A∗BA*BA∗B的矩形,其中每个矩形的四个角被改造成了半径为rrr的四分之一 圆,问这些矩形的凸包周长. 思路:考虑求出圆心的凸包周长然后加上一个整圆的周长,证明很简单,略掉 ...

  5. 2019.02.26 bzoj4311: 向量(线段树分治+凸包)

    传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...

  6. 2019.02.21 bzo1038: [ZJOI2008]瞭望塔(半平面交)

    传送门 题意:给出一个nnn个点的轮廓,要求找一个高度最小的点使得它能够看见所有拐点. 思路:之间建半平面交然后取半平面交上的每个交点和每个轮廓更新答案即可. 代码: #include<bits ...

  7. 2019.02.21 bzoj2739: 最远点(决策单调性+分治)

    传送门 题意简述:给一个N个点的凸多边形,求离每一个点最远的点. 思路:先根据初中数学知识证明决策是满足单调性的,然后上分治优化即可. 才不是因为博主懒得写二分+栈优化呢 代码: #include&l ...

  8. FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM

    FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM T.. = Timeline support 支持时间轴 .S. = Slice t ...

  9. http://www.cnblogs.com/xwdreamer/archive/2012/02/21/2360818.html

    http://www.cnblogs.com/xwdreamer/archive/2012/02/21/2360818.html

随机推荐

  1. 【oracle常见错误】oracle监听程序配置/“ORA-12541: TNS: 无监听程序”

    问题描述 在用PL/SQL Developer连接Oracle 11g时报错“ORA-12541: TNS: 无监听程序”,如下图所示.可以按照如下的步骤进行解决. 解决方案 监听程序配置 从开始菜单 ...

  2. [SQL]sql server中如何直接查询存储过程EXEC返回的结果集?

    Declare @T Table (iDay VARCHAR(),iNum DECIMAL(,),yuxiang DECIMAL(,)) Insert @T --EXEC [dbo].[BSP0101 ...

  3. Reachability实时监控网络变化

    Reachability是一种实时观察网络发生变化控件,如当你的手机处于WiFi情况下,他就会检测环境,当处于GPS的情况下改变环境,当处于无网络的情况下又是一种环境.下面我们看下关于Reachabi ...

  4. Django多个中间件的执行顺序

    Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健 ...

  5. win7+win10系统使用日常经验集锦

    请保留此份 Cmd Markdown 的欢迎稿兼使用说明, 当然你也可以使用彩色字体. 或者使用小体字. 或者使用大体字. 如需撰写新稿件,点击顶部工具栏右侧的 新文稿 或者使用快捷键 Ctrl+Al ...

  6. C++学习基础十六-- 函数学习笔记

    C++ Primer 第七章-函数学习笔记 一步一个脚印.循序渐进的学习. 一.参数传递 每次调用函数时,都会重新创建函数所有的形参,此时所传递的实参将会初始化对应的形参. 「如果形参是非引用类型,则 ...

  7. mazing ASP.NET Core 2.0【转】

    前言 ASP.NET Core 的变化和发展速度是飞快的,当你发现你还没有掌握 ASP.NET Core 1.0 的时候, 2.0 已经快要发布了,目前 2.0 处于 Preview 1 版本,意味着 ...

  8. leetcode771

    int numJewelsInStones(string J, string S) { set<char> st; ; for (auto c : J) { st.insert(c); } ...

  9. Python-反射getattr的应用

    login.py #!/usr/bin/dev python# coding:utf-8 def index(): print u'欢迎访问xx网站首页' def login(): print u'登 ...

  10. 使用Nexus2搭建Maven本地仓库

    由于OS为WindowsXP,而Nexus3forWindows为x64版本,只能选择安装nexus2了. Windows(x86)平台,Nexus Repository Manager OSS 2. ...