新技能GET。

用set保存点,然后只需要找前趋和后继就可以动态维护了。

 /**************************************************************
Problem: 2300
User: idy002
Language: C++
Result: Accepted
Time:556 ms
Memory:4824 kb
****************************************************************/ #include <cstdio>
#include <cmath>
#include <set>
#define N 100010
#define line(a,b) ((b)-(a))
using namespace std; struct Job {
int opt, v;
double ans;
};
struct Vector {
int x, y;
void read() { scanf( "%d%d", &x, &y ); }
Vector(){}
Vector( int x, int y ):x(x),y(y){}
Vector operator+( const Vector &b ) const { return Vector(x+b.x,y+b.y); }
Vector operator-( const Vector &b ) const { return Vector(x-b.x,y-b.y); }
int operator^( const Vector &b ) const { return x*b.y-y*b.x; }
double len() { return sqrt(x*x+y*y); }
bool operator<( const Vector &b ) const {
return x<b.x || (x==b.x && y<b.y);
}
};
typedef Vector Point; int n, m, q;
Point pts[N];
set<Point> cvx;
Job job[N+N];
bool done[N];
double ans; bool onleft( const Point &a, const Point &b, const Point &c ) {
return (line(a,b) ^ line(a,c)) > ;
}
void insert( const Point &p ) {
set<Point>::iterator prv, nxt, prev, next;
prv = nxt = cvx.upper_bound( p );
--prv;
if( !onleft(*nxt,p,*prv) ) return;
while( prv!=cvx.begin() ) {
prev = prv;
--prev;
if( !onleft(p,*prv,*prev) ) {
ans += line(*prev,*nxt).len()-line(*prev,*prv).len()-line(*prv,*nxt).len();
cvx.erase(prv);
} else break;
prv = prev;
}
while( nxt!=cvx.end() ) {
next = nxt;
++next;
if( next==cvx.end() ) break;
if( !onleft(*next,*nxt,p) ) {
ans += line(*prv,*next).len()-line(*prv,*nxt).len()-line(*nxt,*next).len();
cvx.erase(nxt);
} else break;
nxt = next;
}
cvx.insert( p );
ans += line(*prv,p).len()+line(*nxt,p).len()-line(*prv,*nxt).len();
}
int main() {
scanf( "%d", &n );
pts[].read();
scanf( "%d", &m );
for( int i=; i<=m; i++ )
pts[i].read();
scanf( "%d", &q );
for( int i=; i<=q; i++ ) {
scanf( "%d", &job[i].opt );
if( job[i].opt== ) {
scanf( "%d", &job[i].v );
done[job[i].v] = true;
}
}
cvx.insert( Point(,) );
cvx.insert( pts[] );
cvx.insert( Point(n,) );
ans += line(Point(,),pts[]).len() + line(Point(n,),pts[]).len();
for( int i=; i<=m; i++ )
if( !done[i] ) insert( pts[i] );
for( int i=q; i>=; i-- ) {
if( job[i].opt== ) {
insert( pts[job[i].v] );
} else {
job[i].ans = ans;
}
}
for( int i=; i<=q; i++ )
if( job[i].opt== )
printf( "%.2lf\n", job[i].ans );
}

bzoj 2300 动态维护上凸壳(不支持删除)的更多相关文章

  1. 1007: [HNOI2008]水平可见直线[维护下凸壳]

    1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7184  Solved: 2741[Submit][Sta ...

  2. BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )

    离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...

  3. BZOJ 2300 防线修建

    http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题意:给点,有以下操作:删去一个点,询问这些点构成凸包的周长. 思路:用splay维护上凸壳, ...

  4. P3309-[SDOI2014]向量集【线段树,凸壳】

    正题 题目链接:https://www.luogu.com.cn/problem/P3309 题目大意 \(n\)个操作 在序列末尾加入一个向量\((x,y)\) 询问加入的第\(l\sim r\)个 ...

  5. 防线修建 bzoj 2300

    防线修建(1s 512MB)defense [问题描述] 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还 ...

  6. [Gym101982M][思维好题][凸壳]Mobilization

    [gym101982M][思维好题][凸壳]Mobilization 题目链接 20182019-acmicpc-pacific-northwest-regional-contest-div-1-en ...

  7. BZOJ 3672 [Noi2014]购票 (熟练剖分+凸壳维护)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3672 题意:给出一棵有根树(1为根),边有长度.每个点u有三个属性(len[u], ...

  8. bzoj 3165: [Heoi2013]Segment 动态凸壳

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 202  Solved: 89[Submit][Stat ...

  9. bzoj 1007 凸壳

    首先明确一个概念 左面内个叫上凸壳,右面那个叫下凸壳 然后我们只需要维护一个上图壳就行了,先按着斜率排序,每次加进来一条边,判断tot边和这个边与tot-1边的交点横坐标, 如果这条边的横坐标小就一直 ...

随机推荐

  1. oggMonitor是什么

    goldengate monitor是一套监控goldengate的软件,如果安装的ogg比较多,使用goldengate monitor可以清楚的看见全部OGG的每个进程运行状态,以及整个OGG的架 ...

  2. Django中的QuerySet

    一.QuerySet 查询集,类似一个列表,包含了满足查询条件的所有项.QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只有你查询的时候才真正的操作数据库.意味 ...

  3. 1->小规模集群架构规划

    "配置无人值守批量安装系统(Cobbler)" "搭建PPTP VPN/ NTP/Firewalld内部共享上网 " "搭建跳板机服务jumpserv ...

  4. 【自用】bat ftp下载前一天备份

    @echo off rem 指定FTP用户名 set ftpUser=app rem 指定FTP密码 set ftpPass=app rem 指定FTP服务器地址 set ftpIP=192.168. ...

  5. 移动端默认meta标签

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><met ...

  6. drop out为什么能够防止过拟合

    来源知乎: dropout 的过程好像很奇怪,为什么说它可以解决过拟合呢?(正则化) 取平均的作用: 先回到正常的模型(没有dropout),我们用相同的训练数据去训练5个不同的神经网络,一般会得到5 ...

  7. AdvStringGrid 获取值

    stringGrid.row stringgrid.col分别为当前行和列 stringGrid.cells[stringgrid.col,stringGrid.row]就是当前cell的值 ---- ...

  8. B树 B+树 红黑树

    B-Tree(B树) 具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解. ...

  9. 查找Mysql慢查询Sql语句

    一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log 这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_tim ...

  10. sql server中扩展存储过程

    --列出服务器上安装的所有OLEDB提供的程序 execute master..xp_enum_oledb_providers --得到硬盘文件信息 --参数说明:目录名,目录深度,是否显示文件 (少 ...