bzoj 2300 动态维护上凸壳(不支持删除)

 

新技能GET。

 

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

 

  1 /**************************************************************
  2     Problem: 2300
  3     User: idy002
  4     Language: C++
  5     Result: Accepted
  6     Time:556 ms
  7     Memory:4824 kb
  8 ****************************************************************/
  9  
 10 #include <cstdio>
 11 #include <cmath>
 12 #include <set>
 13 #define N 100010
 14 #define line(a,b) ((b)-(a))
 15 using namespace std;
 16  
 17 struct Job {
 18     int opt, v;
 19     double ans;
 20 };
 21 struct Vector {
 22     int x, y;
 23     void read() { scanf( "%d%d", &x, &y ); }
 24     Vector(){}
 25     Vector( int x, int y ):x(x),y(y){}
 26     Vector operator+( const Vector &b ) const { return Vector(x+b.x,y+b.y); }
 27     Vector operator-( const Vector &b ) const { return Vector(x-b.x,y-b.y); }
 28     int operator^( const Vector &b ) const { return x*b.y-y*b.x; }
 29     double len() { return sqrt(x*x+y*y); }
 30     bool operator<( const Vector &b ) const {
 31         return x<b.x || (x==b.x && y<b.y);
 32     }
 33 };
 34 typedef Vector Point;
 35  
 36 int n, m, q;
 37 Point pts[N];
 38 set<Point> cvx;
 39 Job job[N+N];
 40 bool done[N];
 41 double ans;
 42  
 43 bool onleft( const Point &a, const Point &b, const Point &c ) {
 44     return (line(a,b) ^ line(a,c)) > 0;
 45 }
 46 void insert( const Point &p ) {
 47     set<Point>::iterator prv, nxt, prev, next;
 48     prv = nxt = cvx.upper_bound( p );
 49     --prv;
 50     if( !onleft(*nxt,p,*prv) ) return;
 51     while( prv!=cvx.begin() ) {
 52         prev = prv;
 53         --prev;
 54         if( !onleft(p,*prv,*prev) ) {
 55             ans += line(*prev,*nxt).len()-line(*prev,*prv).len()-line(*prv,*nxt).len();
 56             cvx.erase(prv);
 57         } else break;
 58         prv = prev;
 59     }
 60     while( nxt!=cvx.end() ) {
 61         next = nxt;
 62         ++next;
 63         if( next==cvx.end() ) break;
 64         if( !onleft(*next,*nxt,p) ) {
 65             ans += line(*prv,*next).len()-line(*prv,*nxt).len()-line(*nxt,*next).len();
 66             cvx.erase(nxt);
 67         } else break;
 68         nxt = next;
 69     }
 70     cvx.insert( p );
 71     ans += line(*prv,p).len()+line(*nxt,p).len()-line(*prv,*nxt).len();
 72 }
 73 int main() {
 74     scanf( "%d", &n );
 75     pts[0].read();
 76     scanf( "%d", &m );
 77     for( int i=1; i<=m; i++ )
 78         pts[i].read();
 79     scanf( "%d", &q );
 80     for( int i=1; i<=q; i++ ) {
 81         scanf( "%d", &job[i].opt );
 82         if( job[i].opt==1 ) {
 83             scanf( "%d", &job[i].v );
 84             done[job[i].v] = true;
 85         }
 86     }
 87     cvx.insert( Point(0,0) );
 88     cvx.insert( pts[0] );
 89     cvx.insert( Point(n,0) );
 90     ans += line(Point(0,0),pts[0]).len() + line(Point(n,0),pts[0]).len();
 91     for( int i=1; i<=m; i++ ) 
 92         if( !done[i] ) insert( pts[i] );
 93     for( int i=q; i>=1; i-- ) {
 94         if( job[i].opt==1 ) {
 95             insert( pts[job[i].v] );
 96         } else {
 97             job[i].ans = ans;
 98         }
 99     }
100     for( int i=1; i<=q; i++ )
101         if( job[i].opt==2 )
102             printf( "%.2lf\n", job[i].ans );
103 }
View Code

 

转载于:https://www.cnblogs.com/idy002/p/4532744.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Linux内核分析》 第四节 扒开系统调用的三层皮(上)

黄胤凯 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一、视频学习 1.系统调用的三层皮&#xff1a;xyz system_call sys_xyz 对应的是API&#xff0c;中断向量对应的中断服务程序&#xff0c;系统调用服务程…

OllyDBG反汇编快速找到程序入口一点分析

出处&#xff1a;http://hi.baidu.com/0soul/blog/item/b62f8f08c2c3c42c6b60fbbe.html 先声明下&#xff1a;这个和脱壳没关系&#xff0c;不是找壳里面的程序入口哦&#xff0c;只是程序本身的入口&#xff0c;个别朋友不要误会哈。其实这个应该是基础&#xff0c;但我经常找…

PHP计划任务之关闭浏览器后仍然继续执行的函数

函数名称&#xff1a;ignore_user_abort 本函数配置或取得使用端连接中断后&#xff0c;PHP 程序是否仍继续执行。默认值为中断连接后就停止执行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 选项就是配置处。本功能在 PHP 3.0.7 版之后才开始提供。 官方说明…

记对一个key file crackme的破解

crackme下载地址: http://kssd.pediy.com/tutorial/exercise/section04/chap6-1-4-03.zip ------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------…

Chrome/Chromium HTML5 video 视频播放硬件加速

Chromium站点上有个大致的框图。描写叙述了Chromium的video在各个平台 - 包含Android - 上是怎样使用硬件资源来做视频编解码加速的&#xff1a; 而依据Android Kitkat上的Chromium代码分析&#xff0c;HTML5 video播放硬件加速&#xff0c;终于是使用MediaCodec.java来利用本地…

.net mvc结合微软提供的FormsAuthenticationTicket登陆

一、Web.config <system.web><compilation debug"true" targetFramework"4.5" /><httpRuntime targetFramework"4.5" /><authentication mode"Forms"><forms loginUrl"/Sign/SignIn" defaultUrl…

JS 操作 radio input(cc问卷管理)

1、选中特定的单选按钮 function showDetail(content){$("input[name^radio]").removeAttr("checked");for(var i0;i<content.length;i){$("#radio"(i1)content.substr(i,1)).attr("checked","checked");} }2、手动添加问…

Apache Lucene拼写检查器的“您是不是要”功能

Google的“您是不是要”功能 在上一篇文章中对Lucene进行了介绍之后 &#xff0c;现在是时候提高它&#xff0c;创建一个更复杂的应用程序了。 您肯定最熟悉Google的“您是不是要”功能&#xff08;其他搜索引擎也支持此功能&#xff09;。 这是一个例子&#xff1a; Lucene …

Android-做个性化的进度条

1.案例效果图 2.准备素材 progress1.png(78*78) progress2.png(78*78) 3.原理 采用一张图片作为ProgressBar的背景图片(一般采用颜色比较浅的)。另一张是进度条的图片(一般采用颜色比较深的图片)。进度在滚动时&#xff1a;进度图片逐步显示&#xff0c;背景图片逐…

(笔试题)二进制1的个数相同的距离最小数

题目&#xff1a; 输入&#xff1a;整数A输出&#xff1a;整数B条件&#xff1a;A和B的二进制1的个数相同&#xff0c;且A和B之间的距离|A-B|最小。思路&#xff1a; 题目没有说明整数类型&#xff0c;这里认为是带符号的整数&#xff0c;即区分正负数。 根据题意&#xff0c;A…

hadoop5--mapreduce设计模式

运行结果附图 本节课程主要内容为学习MapReduc设计模式&#xff0c;并编写java程序对日志文件进行处理。 课本上介绍的MapReduce的设计模式主要包含:计数(Counting),分类(Classification),过滤处理(Filtering),排序(Sorting),去重计数(Distinct Counting),相关计数(Cross-Corre…

jqGrid,REST,AJAX和Spring MVC集成

两年多以前&#xff0c;我写了一篇关于两个如何在Struts2中实现优雅的CRUD的文章。 实际上&#xff0c;我必须就该主题写两篇文章&#xff0c;因为该主题如此广泛。 今天&#xff0c;我采用了一套更为流行的&#xff0c;完善的框架和库&#xff0c;采用了更为轻量级的现代方法。…

Java-马士兵设计模式学习笔记-代理模式--动态代理 修改成可以代理任意接口

一、概述 1.目标&#xff1a;把Proxy修改成可以代理任意接口及其任意方法 2.思路&#xff1a; (1)代理任意接口&#xff1a;把接口类型作为参数传给Proxy的newProxyInstance(Class interfze) (2)代理任意方法&#xff1a;用interfze.getMethods()取出所有方法&#xff0c;拼接实…

C语言5-7习题

本题要求实现一个函数&#xff0c;用下列公式求cos(x)的近似值&#xff0c;精确到最后一项的绝对值小于e&#xff1a; #include <stdio.h> #include <math.h>double funcos( double e, double x );int main() { double e, x;scanf("%lf %lf", &…

BC div2补题以及 复习模除 逆元__BestCoder Round #78 (div.2)

第一题没话说 智商欠费 加老柴辅导终于过了 需要在意的是数据范围为2的63次方-1 三个数相加肯定爆了 四边形的定义  任意边小于其余三边之和 换句话说就是  最长边小于其余三边之和 这样的话问题转化为 最长边依次减其余三边的结果是否小于等于0 还有一点是题目出现0边 即最…

习题6-1 分类统计字符个数 (15 分)

本题要求实现一个函数&#xff0c;统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。 函数接口定义&#xff1a; void StringCount( char s[] );其中 char s[] 是用户传入的字符串。函数StringCount须在一行内按照 letter 英文字母个数, blank 空格或回车…

Servlet 3.0异步处理可将服务器吞吐量提高十倍

Servlet是Java中处理服务器端逻辑的主要组件&#xff0c;新的3.0规范引入了一些非常有趣的功能&#xff0c;其中异步处理是最重要的功能之一。 可以利用异步处理来开发高度可伸缩的Web应用程序。 使用此功能可以有效地构建Web 2.0站点和AJAX应用程序。 我们的JCG合作伙伴之一To…

使用secureCRT连接VMware-Ubuntukylin虚拟机

使用SecureCRT连接VMware时总是提醒主机拒绝连接。这时可以使用sudo apt-get install openssh-server openssh-client&#xff0c;在主机上安装ssh. 安装成功后&#xff0c;可以连接到主机了。 如果显示远程主机拒绝连接。则可以使用如下方法。 VMware里面装的是Ubuntukylin版本…

国内有哪些好的刷题网站?

http://www.zhihu.com/question/25574458 Luau Lawrence&#xff0c;Data Mining 弱鸡 / PhDNTU 温梦强、石一帆、知乎用户 等人赞同 - Welcome To PKU JudgeOnline 北京大学的Online Judge。POJ上面的题目有点老了&#xff0c;但好处是做的人多&#xff0c;经典算法题多&…