青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

【AHOI2013復仇】動態凸包

Posted on 2013-02-28 18:29 Mato_No1 閱讀(2845) 評論(0)  編輯 收藏 引用 所屬分類: 經典問題的模型動態規劃幾何
原題地址

寫了幾天終于寫出來了……(顯然,我太弱了,請各位神犇不要鄙視)

在有加點的情況下,動態地維護凸包,有以下兩種方法:
<1>維護上、下凸殼(本沙茶采用的方法):
凸包可以拆成上、下凸殼,對它們分別維護。兩個凸殼均按照下面定義的<關系(即先x增、再y增)排序,注意,兩個凸殼的兩端是相同的,均為整個凸包的最小點與最大點,除兩端外,它們沒有公共定點。
以上凸殼為例,設目前加進去的點是P,則有以下三種情況:
1)P小于上凸殼的最小點(這里,對于點"(x1, y1)<(x2, y2)"定義為:x1<x2或x1=x2且y1<y2),此時將P插入上凸殼,并從P開始從小到大遍歷新的上凸殼,將那些旋轉方向不對的點刪掉;
2)P大于上凸殼的最大點(這里,對于點"(x1, y1)>(x2, y2)"定義為:x1>x2或x1=x2且y1>y2),此時將P插入上凸殼,并從P開始從大到小遍歷新的上凸殼,將那些旋轉方向不對的點刪掉;
3)P位于上凸殼的最小點與最大點之間:此時找到上凸殼中,小于等于P的最大點L和大于P的最小點R,判斷PL轉向PR是否為逆時針,若為逆時針,則P在上凸殼外,插入上凸殼,并分別向左右兩個方向遍歷,將旋轉方向不對的點刪掉;
對于下凸殼,1)和2)一樣,3)反過來搞即可。注意在找前趨L和后繼R的時候,可以順便判斷出來P是否在上、下凸殼上,若在凸殼上則不插入。
顯然,這當中有插入、刪除、找值的前趨和后繼等操作,因此需要用平衡樹。由于每個點最多只會被插入一次、刪除一次,且遍歷就意味著刪除,因此總時間復雜度為O(NlogN)。為了加快速度,可以在平衡樹(Splay Tree)中維護子樹的最小、最大結點。
問題是,這種方法寫起來是很復雜的,因為要維護兩棵平衡樹。

<2>極角法(Orz!!):
如果凸包面積大于0,可以在其內部選一個點作為定點,然后將凸包上所有點按照到這個定點的極角遞增排序,用一棵平衡樹維護。
加入新點P時,首先得出P到定點的極角,在平衡樹中找到其前趨和后繼,然后作叉積判斷P是否在外部,若不在外部則不插入,否則插入,并且從這個前趨與這個后繼開始,分別向兩端刪掉旋轉方向不對的多余點。注意,雖然凸包是一個環,但由于按照極角排序了,在平衡樹中仍只能作為鏈來維護,這樣就會出現,在找前趨和后繼的時候,如果在兩端找不到,需要循環,到另一端去找,而且在遍歷的時候,到頭了也要回到另一端。
這種方法的時間復雜度也是O(NlogN),且由于只要維護一棵平衡樹,代碼量減小了很多(木有必要像下面的爛代碼一樣每個操作都加上bool _和N多的[_]了,雖然多了點循環的特判)。

當然,本題是可以不用平衡樹的,而用線段樹——因為可以離線。
還有一個問題就是本題的維護面積問題。面積的2倍可以用各邊兩端點關于任意定點的叉積之和得出,前提是端點按照逆時針排列(最后結果的正負只與端點排列順序有關,與這個定點在哪無關),因此,對于有邊加入或刪除的時候,就可以順便維護出來,當然在有三角形變化的時候可以直接維護三角形。

動態凸包的最主要應用就是那些用凸殼或曲線凸殼優化的DP,雖然這種DP大多數時候只需要維護上或下凸殼就行了囧……比較典型的應用有:
NOI2007 cash(動態維護凸殼,但本題可以用分治轉成離線,從而直接Graham構造解決)
NOI2009 poet(維護曲線凸殼,容易證明這種絕對值P次函數的曲線符合交點只有一個的性質,且對稱軸是越來越右,所以可以直接用隊列維護……MS它是一種有用模型的代表)
BZOJ2149 拆遷隊(由于合法決策要滿足三個條件:決策階段較小、A值較小、F值嚴格比目前階段F值小1,因此需要變序,按照A的遞增序插入決策射線,維護可以離散化后用線段樹,也可以根據A值即為斜率且遞增,直接用棧維護凸殼。當然,本題也需要分治轉成離線)
CEOI2011 ballons(本題的效果值曲線為頂點在X軸上的開口向上的拋物線,由于對稱軸x是遞增的,所以可以只維護右半部分,一個決策插入后影響的是一個區間,可以離散化后用線段樹解決。當然,本題如果對稱軸x不遞增才好玩呢囧……)

代碼:
#include <iostream> 
#include 
<stdio.h> 
#include 
<stdlib.h> 
#include 
<string.h> 
using namespace std; 
#define re(i, n) for (int i=0; i<n; i++) 
#define re1(i, n) for (int i=1; i<=n; i++) 
#define re2(i, l, r) for (int i=l; i<r; i++) 
#define re3(i, l, r) for (int i=l; i<=r; i++) 
#define rre(i, n) for (int i=n-1; i>=0; i--) 
#define rre1(i, n) for (int i=n; i>0; i--) 
#define rre2(i, r, l) for (int i=r-1; i>=l; i--) 
#define rre3(i, r, l) for (int i=r; i>=l; i--) 
#define ll long long 
const int MAXN = 100010
struct poi { 
    ll x, y; 
    
bool operator< (poi p0) const {return x < p0.x || x == p0.x && y < p0.y;} 
    
bool operator> (poi p0) const {return x > p0.x || x == p0.x && y > p0.y;} 
    poi 
operator- (poi p0) {return (struct poi) {x - p0.x, y - p0.y};} 
}; 
struct node { 
    poi v; 
    
int c[2], p, sz, minNo, maxNo; 
    
bool d; 
} T[
2][MAXN]; 
int N[2], root[2]; 
ll res; 
void sc(bool _, int _p, int _c, bool _d) 

    T[_][_p].c[_d] 
= _c; T[_][_c].p = _p; T[_][_c].d = _d; 

void upd(bool _, int No) 

    
int lch = T[_][No].c[0], rch = T[_][No].c[1]; 
    T[_][No].sz 
= T[_][lch].sz + T[_][rch].sz + 1
    T[_][No].minNo 
= lch ? T[_][lch].minNo : No; T[_][No].maxNo = rch ? T[_][rch].maxNo : No; 

void rot(bool _, int No) 

    
int p = T[_][No].p; bool d = T[_][No].d; 
    
if (p == root[_]) T[_][root[_] = No].p = 0else sc(_, T[_][p].p, No, T[_][p].d); 
    sc(_, p, T[_][No].c[
!d], d); sc(_, No, p, !d); upd(_, p); 

void splay(bool _, int No, int r) 

    
int p; while ((p = T[_][No].p) != r) if (T[_][p].p == r) rot(_, No); else if (T[_][p].d == T[_][No].d) rot(_, p), rot(_, No); else rot(_, No), rot(_, No); upd(_, No); 

void ins(bool _, poi v0) 

    
if (!root[_]) { 
        T[_][root[_] 
= ++N[_]].p = 0; T[_][N[_]].c[0= T[_][N[_]].c[1= 0; T[_][N[_]].sz = 1; T[_][N[_]].minNo = T[_][N[_]].maxNo = N[_]; T[_][N[_]].v = v0; return
    } 
    poi v; 
int i = root[_], j; 
    
while (1) { 
        v 
= T[_][i].v; T[_][i].sz++; j = T[_][i].c[v0 > v]; if (j) i = j; else break
    } 
    T[_][
++N[_]].c[0= T[_][N[_]].c[1= 0; T[_][N[_]].sz = 1; T[_][N[_]].v = v0; T[_][N[_]].minNo = T[_][N[_]].maxNo = N[_]; sc(_, i, N[_], v0 > v); 
    splay(_, N[_], 
0); 

int uni(bool _, int A, int B) 

    
if (!A) return B; else if (!B) return A; else if ((A + B) & 1) { 
        
int S = uni(_, A, T[_][B].c[0]); 
        sc(_, B, S, 
0); upd(_, B); return B; 
    } 
else { 
        
int S = uni(_, T[_][A].c[1], B); 
        sc(_, A, S, 
1); upd(_, A); return A; 
    } 

int L(bool _, poi v0) 

    
int i = root[_], j, res0 = -1; poi v; 
    
while (1) { 
        v 
= T[_][i].v; 
        
if (v0 < v) j = T[_][i].c[0]; else if (v0 > v) {j = T[_][i].c[1]; res0 = i;} else return i; 
        
if (j) i = j; else break
    } 
    
return res0; 

int R(bool _, poi v0) 

    
int i = root[_], j, res0 = -1; poi v; 
    
while (1) { 
        v 
= T[_][i].v; 
        
if (v0 < v) {j = T[_][i].c[0]; res0 = i;} else if (v0 > v) j = T[_][i].c[1]; else return i; 
        
if (j) i = j; else break
    } 
    
return res0; 

ll cr(poi p0, poi p1) 

    
return p0.x * p1.y - p0.y * p1.x; 

void solve(poi p) 

    
int _L = L(0, p); if (_L >= 0 && !(T[0][_L].v < p || p < T[0][_L].v)) return
    
int _R = R(0, p), _L0, _R0, _; bool FF; ll cr0; 
    
if (_L == -1) { 
        res 
+= cr(T[0][_R].v, p); FF = 1
    } 
else if (_R == -1) { 
        res 
+= cr(p, T[0][_L].v); FF = 1
    } 
else { 
        cr0 
= cr(T[0][_L].v - p, T[0][_R].v - p); 
        
if (cr0 > 0) {res += cr0; FF = 1;} else FF = 0
    } 
    
if (FF) { 
        ins(
0, p); 
        
while (_L = T[0][root[0]].c[0]) { 
            _L0 
= T[0][_L].maxNo; splay(0, _L0, root[0]); _L = T[0][root[0]].c[0]; 
            
if (T[0][_L].c[0]) _L0 = T[0][T[0][_L].c[0]].maxNo; else break
            cr0 
= cr(T[0][_L].v - p, T[0][_L0].v - p); 
            
if (cr0 <= 0) {res -= cr0; _ = uni(0, T[0][_L].c[0], T[0][_L].c[1]); sc(0, root[0], _, 0); upd(0, root[0]);} else break
        } 
        
while (_R = T[0][root[0]].c[1]) { 
            _R0 
= T[0][_R].minNo; splay(0, _R0, root[0]); _R = T[0][root[0]].c[1]; 
            
if (T[0][_R].c[1]) _R0 = T[0][T[0][_R].c[1]].minNo; else break
            cr0 
= cr(T[0][_R].v - p, T[0][_R0].v - p); 
            
if (cr0 >= 0) {res += cr0; _ = uni(0, T[0][_R].c[0], T[0][_R].c[1]); sc(0, root[0], _, 1); upd(0, root[0]);} else break
        } 
    } 
    _L 
= L(1, p); if (_L >= 0 && !(T[1][_L].v < p || p < T[1][_L].v)) returnelse _R = R(1, p); 
    
if (_L == -1) { 
        res 
+= cr(p, T[1][_R].v); FF = 1
    } 
else if (_R == -1) { 
        res 
+= cr(T[1][_L].v, p); FF = 1
    } 
else { 
        cr0 
= cr(T[1][_L].v - p, T[1][_R].v - p); 
        
if (cr0 < 0) {res -= cr0; FF = 1;} else FF = 0
    } 
    
if (FF) { 
        ins(
1, p); 
        
while (_L = T[1][root[1]].c[0]) { 
            _L0 
= T[1][_L].maxNo; splay(1, _L0, root[1]); _L = T[1][root[1]].c[0]; 
            
if (T[1][_L].c[0]) _L0 = T[1][T[1][_L].c[0]].maxNo; else break
            cr0 
= cr(T[1][_L].v - p, T[1][_L0].v - p); 
            
if (cr0 >= 0) {res += cr0; _ = uni(1, T[1][_L].c[0], T[1][_L].c[1]); sc(1, root[1], _, 0); upd(1, root[1]);} else break
        } 
        
while (_R = T[1][root[1]].c[1]) { 
            _R0 
= T[1][_R].minNo; splay(1, _R0, root[1]); _R = T[1][root[1]].c[1]; 
            
if (T[1][_R].c[1]) _R0 = T[1][T[1][_R].c[1]].minNo; else break
            cr0 
= cr(T[1][_R].v - p, T[1][_R0].v - p); 
            
if (cr0 <= 0) {res -= cr0; _ = uni(1, T[1][_R].c[0], T[1][_R].c[1]); sc(1, root[1], _, 1); upd(1, root[1]);} else break
        } 
    } 

int main() 

    
int m; poi p0, p1, p2, _; 
    scanf(
"%lld%lld%lld%lld%lld%lld%d"&p0.x, &p0.y, &p1.x, &p1.y, &p2.x, &p2.y, &m); 
    
if (p1 < p0) {_ = p0; p0 = p1; p1 = _;} if (p2 < p0) {_ = p0; p0 = p2; p2 = _;} if (p2 < p1) {_ = p1; p1 = p2; p2 = _;} 
    ins(
0, p0); ins(0, p2); ins(1, p0); ins(1, p2); ll __ = cr(p0 - p1, p2 - p1); 
    
if (__ > 0) ins(0, p1); else if (__ < 0) ins(1, p1); 
    res 
= __ >= 0 ? __ : -__; 
    re(i, m) { 
        scanf(
"%lld%lld"&_.x, &_.y); 
        solve(_); 
        printf(
"%lld\n", res >= 0 ? res : -res); 
    } 
    
return 0
}
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久噜噜噜久久狠狠50岁| 欧美中文字幕视频| 国产精品麻豆va在线播放| 欧美日韩成人一区二区三区| 欧美二区在线观看| 欧美另类变人与禽xxxxx| 欧美高清在线观看| 国产精品激情| 国产在线拍揄自揄视频不卡99| 国产日产欧美精品| 在线观看一区二区视频| 亚洲欧洲一二三| 亚洲一区二区在线免费观看视频| 午夜激情亚洲| 欧美成人dvd在线视频| 91久久午夜| av成人老司机| 亚洲欧美制服中文字幕| 久久综合国产精品| 亚洲第一区在线观看| 亚洲欧洲日韩综合二区| 亚洲一区二区毛片| 美乳少妇欧美精品| 国产免费观看久久| 日韩视频一区二区三区在线播放| 午夜日韩在线| 亚洲精品久久久一区二区三区| 亚洲综合精品| 欧美精品久久天天躁| 国产亚洲精品aa午夜观看| 日韩亚洲成人av在线| 久久这里只有精品视频首页| 亚洲精品在线观看免费| 久久久久久久久久码影片| 国产精品久久久久久久久久妞妞| 亚洲国产经典视频| 久久精品国产一区二区三| 亚洲精品久久久久久久久| 久久久久久网址| 国产久一道中文一区| 一本色道久久综合亚洲二区三区| 久久综合久久美利坚合众国| 午夜精品国产精品大乳美女| 欧美三级在线播放| 亚洲伦理在线观看| 亚洲成人在线视频播放| 欧美日韩日日骚| 激情成人综合网| 香蕉乱码成人久久天堂爱免费| 亚洲黄页视频免费观看| 久久亚洲视频| 在线成人中文字幕| 久久久久久国产精品一区| 亚洲永久免费观看| 国产精品免费电影| 亚洲影院免费观看| 中文国产成人精品久久一| 欧美天天在线| 亚洲欧美久久久久一区二区三区| 亚洲九九爱视频| 欧美另类高清视频在线| 亚洲精选成人| 亚洲三级视频在线观看| 欧美精品一区二区三区久久久竹菊| 亚洲承认在线| 欧美二区视频| 久热精品视频在线观看一区| 亚洲第一色在线| 亚洲高清免费视频| 欧美日韩1234| 亚洲欧美国产日韩天堂区| 亚洲一区二区影院| 国产亚洲精品v| 老色鬼久久亚洲一区二区| 久久尤物电影视频在线观看| 亚洲第一区中文99精品| 欧美激情国产高清| 欧美久久久久久久| 亚洲一区综合| 国产精品欧美日韩| 久久精品成人一区二区三区蜜臀 | 欧美与黑人午夜性猛交久久久| 国产精品久久久久久av下载红粉| 亚洲在线黄色| 欧美一区二区三区四区在线| 国内外成人免费激情在线视频网站 | 久久精品日产第一区二区三区| 激情综合自拍| 亚洲风情亚aⅴ在线发布| 欧美连裤袜在线视频| 欧美一区=区| 久久综合久久久| 国产精品99久久99久久久二8| 亚洲一区二区三区四区中文| 狠狠综合久久av一区二区老牛| 亚洲福利电影| 国产日韩欧美高清免费| 欧美成人一区二区三区| 国产精品高潮呻吟久久av黑人| 久久久国产成人精品| 欧美黄网免费在线观看| 久久av一区二区三区漫画| 免费视频一区| 亚洲欧美文学| 欧美福利影院| 久久久久在线观看| 国产精品www| 欧美高清自拍一区| 国产一区二区三区久久久久久久久 | 另类激情亚洲| 国产精品视频自拍| 欧美激情aⅴ一区二区三区| 国产女精品视频网站免费| 欧美激情视频一区二区三区在线播放 | 国产精品大片| 亚洲福利视频在线| 国产一区二区三区在线观看精品 | 亚洲欧美美女| 免费久久久一本精品久久区| 久久成人精品无人区| 国产精品久久一卡二卡| 亚洲精品一区二区在线| 亚洲精品国产精品国自产在线 | 亚洲欧美视频在线观看| 亚洲裸体俱乐部裸体舞表演av| 久久激情综合网| 欧美中文字幕在线观看| 国产精品99一区二区| 亚洲精品久久久久久久久久久久久| 在线观看成人小视频| 亚洲欧美中文在线视频| 欧美在线观看视频一区二区| 国产精品一区二区三区久久| 一区二区三区精品国产| 一本色道久久综合亚洲精品按摩| 免费在线日韩av| 亚洲电影自拍| 亚洲精品小视频| 欧美国产日韩二区| 亚洲国产99精品国自产| 亚洲精品1区2区| 麻豆精品一区二区综合av| 欧美成人免费全部观看天天性色| 在线观看欧美一区| 久久综合给合久久狠狠狠97色69| 欧美国产日本在线| 日韩视频免费在线| 欧美三日本三级少妇三2023 | 狂野欧美性猛交xxxx巴西| 国内精品免费在线观看| 久久九九精品| 亚洲激情一区| 性欧美大战久久久久久久免费观看 | 国产精品99久久久久久白浆小说| 午夜精品久久一牛影视| 国产一区激情| 麻豆精品一区二区综合av| 亚洲精品你懂的| 亚洲区国产区| 国产精品久久久久久久第一福利| 亚洲欧美国产视频| 免费亚洲视频| 亚洲一区二区三区色| 国内精品免费午夜毛片| 欧美高清不卡在线| 中国亚洲黄色| 美国十次成人| 亚洲伊人第一页| 亚洲国产精品尤物yw在线观看| 欧美日韩高清在线播放| 久久99在线观看| 亚洲人成网站999久久久综合| 欧美一区二区在线视频| 亚洲精品小视频| 国产一区二区三区四区| 欧美视频一区二区在线观看| 久久在线播放| 亚洲一区www| 欧美国产国产综合| 欧美一级欧美一级在线播放| 亚洲区一区二区三区| 国产麻豆日韩欧美久久| 欧美高清你懂得| 午夜激情综合网| 一区二区三区欧美日韩| 亚洲国产成人一区| 久久伊伊香蕉| 欧美一区1区三区3区公司| 一区二区欧美日韩视频| 永久91嫩草亚洲精品人人| 欧美午夜一区二区三区免费大片| 欧美黑人国产人伦爽爽爽| 久久av一区二区三区漫画| 亚洲视频观看| 亚洲美女尤物影院| 亚洲大胆女人| 国产主播一区二区三区四区| 国产精品wwwwww| 欧美日韩妖精视频| 欧美激情精品久久久久久大尺度|