bzoj 2300 动态维护上凸壳(不支持删除)
新技能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 动态维护上凸壳(不支持删除)的更多相关文章
- 1007: [HNOI2008]水平可见直线[维护下凸壳]
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7184 Solved: 2741[Submit][Sta ...
- BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...
- BZOJ 2300 防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题意:给点,有以下操作:删去一个点,询问这些点构成凸包的周长. 思路:用splay维护上凸壳, ...
- P3309-[SDOI2014]向量集【线段树,凸壳】
正题 题目链接:https://www.luogu.com.cn/problem/P3309 题目大意 \(n\)个操作 在序列末尾加入一个向量\((x,y)\) 询问加入的第\(l\sim r\)个 ...
- 防线修建 bzoj 2300
防线修建(1s 512MB)defense [问题描述] 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还 ...
- [Gym101982M][思维好题][凸壳]Mobilization
[gym101982M][思维好题][凸壳]Mobilization 题目链接 20182019-acmicpc-pacific-northwest-regional-contest-div-1-en ...
- BZOJ 3672 [Noi2014]购票 (熟练剖分+凸壳维护)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3672 题意:给出一棵有根树(1为根),边有长度.每个点u有三个属性(len[u], ...
- bzoj 3165: [Heoi2013]Segment 动态凸壳
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 202 Solved: 89[Submit][Stat ...
- bzoj 1007 凸壳
首先明确一个概念 左面内个叫上凸壳,右面那个叫下凸壳 然后我们只需要维护一个上图壳就行了,先按着斜率排序,每次加进来一条边,判断tot边和这个边与tot-1边的交点横坐标, 如果这条边的横坐标小就一直 ...
随机推荐
- 【逆向知识】开发WinDBG扩展DLL
如何开发WinDbg扩展DLL WinDbg扩展DLL是一组导出的回调函数,用于实现用户定义的命令.以便从内存转储中提取特定的信息.扩展dll由调试器引擎加载,可以在执行用户模式或内核模式调试时提供自 ...
- aarch64_p1
PEGTL-devel-1.3.1-2.fc26.aarch64.rpm 2017-02-14 08:00 63K fedora Mirroring Project PackageKit-1.1.6- ...
- LINUX的DNS设置【转】
网卡DNS设置 用windos系统大家都知道,本地连接里面有一个DNS设置. 那么这个选项对应Linux系统的话就是在网卡配置文件,通过编辑vi /etc/sysconfig/network-scr ...
- mysql备份参数--master-data和--dump-slave的介绍
[mysql@db2 ~]$ mysqldump -A --master-data=2 > master2.sql[mysql@db2 ~]$ mysqldump -A --master-dat ...
- 根据经纬度坐标计算距离-python
一.两个坐标之间距离计算 参考链接: python实现 1.Python 根据地址获取经纬度及求距离 2.python利用地图两个点的经纬度计算两点间距离 LBS 球面距离公式 美团app筛选“离我最 ...
- MyEclipse开发工具,当选中一个单词时,其他相同的单词会被高亮显示(选中/标记)
1.步骤: Window-->Preferences-->Java-->Editor-->Mark Occurremces下的 Mark Occurremces of the ...
- 忘记SVN密码怎么办
1:下载TSvnPwd.exe 2:使用wireshark抓包.例如: PROPFIND /svn/dev2/!svn/vcc/default HTTP/1.1Host: 192.168.156.1: ...
- Service(一):认识service、绑定Service
Activity是与用户打交道的,而Service是在后台运行的. 这个程序介绍了下如何启动和停止一个Service,以及在后台打印消息,我添加了一些注释. 在activity_main中将布局改为线 ...
- linux 安装 Elasticsearch6.4.0详细步骤以及问题解决方案
1.jdk 安装 参考资料:https://www.cnblogs.com/shihaiming/p/5809553.html 2.elasticsearch 安装 下载:https://artifa ...
- 关于Eclipse连接sql server 2008的若干问题
以下内容转自:https://www.cnblogs.com/skylarzhan/p/7619977.html Eclipse中使用SQL server 2008数据库 一.准备材料 要能够使用数据 ...