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.pswp.cn/news/374993.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374993.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374993.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

帶有Guice的富域模型

貧血域模型是一個非常常見的反模式。 在ORM和DI框架的世界中&#xff0c;我們自然會發現自己擁有一個由ORM管理的“域”&#xff0c;該域包含所有數據且無行為。 通過我們的DI框架有幫助地注入了輔助類&#xff0c;這些輔助類都是行為且沒有數據。 在本文中&#xff0c;我將介紹…

php匿名函數小示例

<?php //$fun function($params){ // echo $params; //}; // //$fun(aa);//例一 //在普通函數中定義一個匿名函數 //function printStr(){ // $fun function($something){ // echo $something; // }; // $fun(something); // //} //printStr();//例子…

購書心得

作者&#xff1a;泉哥主頁&#xff1a;http://riusksk.blogbus.com富家不用買良田&#xff0c;書中自有千鐘粟&#xff1b;安居不用架高堂&#xff0c;書中自有黃金屋&#xff1b;出門莫恨無人隨&#xff0c;書中車馬多如簇&#xff1b;娶妻莫恨無良媒&#xff0c;書中自有顏如…

MariaDB?條件語句WHERE

MariaDB 條件語句WHEREWHERE Clause Operators Operator Description Equality<> Nonequality! Nonequality< Less than< Less than or equal to > Greater than > Greater than or equal to BETWEEN Between two specified values BETWEEN AND (jlive)[c…

Spring 3.1緩存抽象教程

即將發布的Spring 3.1版本中引入的新功能之一是緩存抽象之一 。 Spring Framework提供了對將緩存透明添加到現有Spring應用程序中的支持。 與事務支持類似&#xff0c;緩存抽象允許一致使用各種緩存解決方案&#xff0c;而對代碼的影響最小。 從本質上講&#xff0c;抽象將緩存…

《Linux內核分析》 第四節 扒開系統調用的三層皮(上)

黃胤凱 原創作品轉載請注明出處 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 一、視頻學習 1.系統調用的三層皮&#xff1a;xyz system_call sys_xyz 對應的是API&#xff0c;中斷向量對應的中斷服務程序&#xff0c;系統調用服務程…

如何在Java中獲得類似于C的性能

總覽 Java有許多可能很慢的領域。 但是&#xff0c;對于每個問題都有解決方案。 許多解決方案/黑客都需要解決Java的保護問題&#xff0c;但是如果您需要低水平的性能&#xff0c;還是可以的。 Java使高級編程變得更簡單容易&#xff0c;但代價是使低級編程變得更加困難。 幸…

STARTUPINFO結構

1.結構原型 typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD w…

Spring聲明式事務示例

事務是具有ACID &#xff08;原子的&#xff0c;一致的&#xff0c;隔離的和持久的&#xff09;屬性的工作單元。 原子意味著所有更改都發生或什么都沒有發生。 如果從一個帳戶借錢并貸記到另一個帳戶&#xff0c;則交易將確保借記和貸項均已完成或均未完成。 一致表示更改使數…

路徑 (Path)–nodejs

本模塊包含一套用于處理和轉換文件路徑的工具集。幾乎所有的方法只做字符串變換&#xff0c; 不會調用文件系統檢查路徑是否有效。 通過 require(path) 來加載此模塊。以下是本模塊所提供的方法&#xff1a; path.normalize(p) 規范化字符串路徑&#xff0c;注意 .. 和 . 部分 …

OllyDBG反匯編快速找到程序入口一點分析

出處&#xff1a;http://hi.baidu.com/0soul/blog/item/b62f8f08c2c3c42c6b60fbbe.html 先聲明下&#xff1a;這個和脫殼沒關系&#xff0c;不是找殼里面的程序入口哦&#xff0c;只是程序本身的入口&#xff0c;個別朋友不要誤會哈。其實這個應該是基礎&#xff0c;但我經常找…

簡單的Twitter:Heroku上的Play框架,AJAX,CRUD

因此&#xff0c;重大的公告發布了– Heroku開始為Play Framework應用程序提供本機支持&#xff01; 如果您還沒有聽說過&#xff0c;請在Heroku的博客上查看Jesper Joergensen的帖子 。 因此&#xff0c;對于演示&#xff0c;我將建立一個非常基本的Twitter副本&#xff1b; 它…

Cron表達式

CronTrigger CronTriggers往往比SimpleTrigger更有用&#xff0c;如果您需要基于日歷的概念&#xff0c;而非SimpleTrigger完全指定的時間間隔&#xff0c;復發的發射工作的時間表。CronTrigger&#xff0c;你可以指定觸發的時間表如“每星期五中午”&#xff0c;或“每個工作日…

深入理解JavaScript學習筆記(3)_全面解析Module模式

簡介 Module模式是JavaScript編程中一個非常通用的模式&#xff0c;一般情況下&#xff0c;大家都知道基本用法&#xff0c;本文嘗試著給大家更多該模式的高級使用方式。 首先我們來看看Module模式的基本特征&#xff1a; 模塊化&#xff0c;可重用封裝了變量和function&#x…

匯編----乘指令: MUL、IMUL

MUL: 無符號乘 ;影響 OF、CF 標志位;指令格式:;MUL r/m ;參數是乘數;如果參數是 r8/m8, 將把 AL 做乘數, 結果放在 AX;如果參數是 r16/m16, 將把 AX 做乘數, 結果放在 EAX;如果參數是 r32/m32, 將把 EAX 做乘數, 結果放在 EDX:EAX IMUL: 有符號乘 ;影響 OF、CF 標志位;…

Google App Engine Java功能和命名空間API

功能API 使用Capabilities API&#xff0c;您的應用程序可以檢測特定API功能的停機和計劃停機時間。 您可以使用此API來檢測應用程序何時不可用&#xff0c;然后繞過它來減少應用程序的停機時間。 我們該如何處理&#xff0c;這是個折衷方案&#xff1f; 1.優雅&#xff1a;創…

破解key file時經常用到的幾個API函數及其用法

CreateFile函數 ================================================================================== CreateFile: Creates or opens a file or I/O device. The most commonly used I/O devices are as follows: file, file stream, directory, physical disk, volume, …

PHP計劃任務之關閉瀏覽器后仍然繼續執行的函數

函數名稱&#xff1a;ignore_user_abort 本函數配置或取得使用端連接中斷后&#xff0c;PHP 程序是否仍繼續執行。默認值為中斷連接后就停止執行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 選項就是配置處。本功能在 PHP 3.0.7 版之后才開始提供。 官方說明…