2019.02.21 bzoj1249: SGU277 HERO 动态凸包(set+凸包)
传送门
题意:动态插入点,维护凸包面积。
思路:用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+凸包)的更多相关文章
- bzoj1249: SGU277 HERO 动态凸包
动态维护凸包面积. //Achen #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);i++) #def ...
- 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)
传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...
- 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 ...
- 2019.02.21 bzoj2829: 信用卡凸包(凸包)
传送门 题意:给nnn个A∗BA*BA∗B的矩形,其中每个矩形的四个角被改造成了半径为rrr的四分之一 圆,问这些矩形的凸包周长. 思路:考虑求出圆心的凸包周长然后加上一个整圆的周长,证明很简单,略掉 ...
- 2019.02.26 bzoj4311: 向量(线段树分治+凸包)
传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...
- 2019.02.21 bzo1038: [ZJOI2008]瞭望塔(半平面交)
传送门 题意:给出一个nnn个点的轮廓,要求找一个高度最小的点使得它能够看见所有拐点. 思路:之间建半平面交然后取半平面交上的每个交点和每个轮廓更新答案即可. 代码: #include<bits ...
- 2019.02.21 bzoj2739: 最远点(决策单调性+分治)
传送门 题意简述:给一个N个点的凸多边形,求离每一个点最远的点. 思路:先根据初中数学知识证明决策是满足单调性的,然后上分治优化即可. 才不是因为博主懒得写二分+栈优化呢 代码: #include&l ...
- 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 ...
- http://www.cnblogs.com/xwdreamer/archive/2012/02/21/2360818.html
http://www.cnblogs.com/xwdreamer/archive/2012/02/21/2360818.html
随机推荐
- ZooKeeper和CAP理论及一致性原则
一.CAP理论概述CAP理论告诉我们,一个分布式系统不可能同时满足以下三种 一致性(C:Consistency)可用性(A:Available)分区容错性(P:Partition Tolerance) ...
- servlet cdi analysis
CDI中最令人兴奋的功能是允许每个人在Java EE平台中编写强大的扩展性功能,甚至于改变其核心本身.这些扩展性功能是可以完全移植到任何支持CDI的环境中. CDI的一些主要特性 1.类型安全:CDI ...
- C语言 练习题
subString #include <iostream> int subString(char* sSeek, char* sKey) { char* p = sSeek; while( ...
- docker 在windows7 、8下的安装
这里说明一下这种安装方式适合win7 win8的系统环境下安装的,当然win10也可以,但是win10有更好的方式 即安装Docker Toolbox,同时还附加安装 Docker Client fo ...
- redis消息通知(任务队列/优先级队列/发布订阅模式)
1.任务队列 对于发送邮件或者是复杂计算这样的操作,常常需要比较长的时间,为了不影响web应用的正常使用,避免页面显示被阻塞,常常会将此类任务存入任务队列交由专门的进程去处理. 队列最基础的方法如下: ...
- 开启safe_mode之后对php系统函数的影响
safe_mode即为PHP的安全模式,在php.ini中设置safe_mode = On重启PHP便可开启安全模式. 当安全模式开启后,PHP相应的一些系统函数,文件操作函数等将会受限.例如: ck ...
- html:class名命名规范
1 前端开发命名规范 1.1 为什么要制定CSS命名规范 统一的命名规范,便于多人开发维护时代码统一,减少项目沟通和交接的成本,增加代码的语义化. 1.2 CSS命名规则 样式类名全部用小写,首字符必 ...
- 关于如何安装使用Git、tortoiseGit、Git@osc
摘要: 讲解git在git@osc上使用的正确入门姿势. 关于Git代码托管的好处,这里就不再进行说明了.相信想去使用的人都应该有所了解啦.在使用开源中国里面的git@osc时,我们得先做入下几个工作 ...
- Sql Server数据库之流程定义变量和流程控制语句
一.局部变量和全局变量 1.声明局部变量 语法:declare @变量名 变量类型 2.给局部变量赋值 语法:set @变量名=值, select @变量名=值 区别:第一种方式用于普 ...
- Sql Server数据库之四个增删改查
一.数据库的增删改查 1.新建数据库 create database students on primary ( name="students_data",--主数据文件的逻辑名 ...