新技能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. python 爬虫简单的demo

    ''' @author :Eric-chen @contact:809512722@qq.com @time :2018/1/3 17:55 @desc :通过爬取http://movie.douba ...

  2. Linux移植随笔:对tslib库的ts_test测试程序代码的一点分析【转】

    转自:http://www.latelee.org/embedded-linux/porting-linux-tstest-code.html 本文是作者对tslib库的ts_test.c文件进行分析 ...

  3. aarch64_m1

    MAKEDEV-3.24-18.fc26.aarch64.rpm 2017-02-14 08:46 99K fedora Mirroring Project MUMPS-5.0.2-8.fc26.aa ...

  4. GitHub安装和使用

    GitHub是一个基于git的代码托管平台,付费用户可以建私人仓库,一般的免费用户只能使用公共仓库,也就是代码要公开. Github 由Chris Wanstrath, PJ Hyett 与Tom P ...

  5. Failed to load class "org.slf4j.impl.StaticLoggerBinder"

    调试程序出现如下错误: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Default ...

  6. [android] The_connection_to_adb_is_down__and_a_severe_error_has_occured解决方案

    初学安卓,这是我碰到的第一个问题,从网上找了些解决方法,同时也把问题解决了. 方案一 1.先把eclipse关闭. 2.在管理器转到你的android SDK 的platform-tools下, 如图 ...

  7. AT994 【11の倍数】

    超短AC代码压行小技巧 #include<iostream> using namespace std; string s; ]; int main() { cin>>s; in ...

  8. Maven3 生命周期与插件(笔记五)

    第一节:Maven 生命周期 Maven 生命周期简介:Maven 通过插件的方式完成一系列过程来实现功能. Maven 拥有三套独立的生命周期: Clean 清理项目 Default 构建项目 Si ...

  9. 在 SQL Server 2005 中配置数据库邮件

    一.            SQL Server发邮件原理和组件介绍: 数据库邮件有4个组件:配置文件.邮件处理组件.可执行文件以及“日志记录和审核组件”. l  配置组件包括: 1)数据库邮件帐户包 ...

  10. GreenPlum学习笔记:create table创建表

    二维表同样是GP中重要的存储数据对象,为了更好的支持数据仓库海量数据的访问,GP的表可以分成: 面向行存储的普通堆积表 面向列存储的AOT表(append only table) 当然AOT表也可以是 ...