新技能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. Jenkins+Ant+TestNG+Testlink自动化构建集成

    这段时间折腾自动化测试,之前都是在Eclipse工程里面手工执行自动化测试脚本,调用Testlink API执行测试用例,目前搭建Jenkins自动化构建测试的方式,实现持续构建,执行自动化测试. 硬 ...

  2. scala中“_”的用法

    参见链接 http://blog.csdn.net/i6448038/article/details/50017427

  3. 【Android开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver

    广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都 ...

  4. 分享一个自己写的vue多语言插件smart-vue-i18n

    前言 目前有比较成熟的方案(vue-i18n)了解了下,并且实用了一下感觉对于我在使用的项目来说略显臃肿,功能比较多,所以压缩的会比较大,在移动端不太适合所以自己花一天时间撸了一个vue多语言插件,压 ...

  5. php-fpm和cgi,并发响应的理解以及高并发和多线程的关系

    首先搞清楚php-fpm与cgi的关系 cgi cgi是一个web server与cgi程序(这里可以理解为是php解释器)之间进行数据传输的协议,保证了传递的是标准数据. php-cgi php-c ...

  6. 关于SQLserver的索引的一些脚本

    --判断无用的索引: SELECT TOP 30 DB_NAME() AS DatabaseName , '[' + SCHEMA_NAME(o.Schema_ID) + ']' + '.' + '[ ...

  7. Mget is available.

    Table of Contents 1. Introduction 2. Use tmget in gentoo 3. About MTU 1 Introduction MulityGet to sp ...

  8. Executor

    一.为什么需要Executor?为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制.他们都在java.util.concurrent包中,是JDK并发包的核 ...

  9. 第五届CCF软件能力认证

    1.数列分段 问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, … ...

  10. 1975: [Sdoi2010]魔法猪学院

    k短路,只会写A*的飘过..priority_queue超空间差评!