1. 程式人生 > >利用線段樹維護凸殼(李超樹)

利用線段樹維護凸殼(李超樹)

Text

之前聽lyd_729神犇講過關於李超樹的思想,大概是標記永久化一類的

要求支援動態插入直線(線段),動態查詢上/下凸殼與x=k的交點,k為整數
今天做模擬賽的時候剛好碰到一題,然而忘得差不多了
考場上自己YY了一個:

線段樹每一個區間都儲存一條直線,表示在這個區間中這條直線有可能有一部分為凸殼中的邊

當我們需要插入一條直線(線段),與當前線段樹區間儲存的直線進行比較,看哪一個斜率大,哪一個更優的部分佔整個區間更多(就是比較區間中點和直線交點)

將佔整個區間更多的儲存為當前區間的直線,另外一條則遞迴到相應的兒子去

如果一條直線在這個區間內完全都比另一條優,那就可以直接儲存返回了

比完賽看了一下網上關於李超樹的講解,覺得自己真是個SB
其實可以直接比較這兩條直線哪個斜率大,比較這兩條在區間中點時的值然後直接判斷即可,就不需要計算交點了

模板

相當的醜
大佬們將就著看吧。。

LL calc(LL k,LL h,LL w)
{
    return k*w+h;
}
int nwp(int k)
{
    if(k) return k;
    tr[++n1].l=tr[n1].r=tr[n1].k=tr[n1].h=0;
    return n1;
}
LL get(int k,int l,int r,int t)
{
    if(l==r&&l==t) return
calc(tr[k].k,tr[k].h,t); int mid=(l+r)/2; LL v=0; tr[k].l=nwp(tr[k].l),tr[k].r=nwp(tr[k].r); if(t<=mid) v=get(tr[k].l,l,mid,t); else v=get(tr[k].r,mid+1,r,t); return max(calc(tr[k].k,tr[k].h,t),v); } double dot(LL k1,LL h1,LL k2,LL h2) { return (h2-h1)*1.0/(k1-k2); } void ins(int
k,int l,int r,LL dx,LL hi) { if(l==r) { if(calc(dx,hi,l)>calc(tr[k].k,tr[k].h,l)) tr[k].k=dx,tr[k].h=hi; return; } if(calc(dx,hi,l)>=calc(tr[k].k,tr[k].h,l)&&calc(dx,hi,r)>=calc(tr[k].k,tr[k].h,r)) { tr[k].k=dx,tr[k].h=hi; return; } if(calc(dx,hi,l)<calc(tr[k].k,tr[k].h,l)&&calc(dx,hi,r)<calc(tr[k].k,tr[k].h,r)) return; int mid=(l+r)/2; tr[k].l=nwp(tr[k].l),tr[k].r=nwp(tr[k].r); double w=dot(dx,hi,tr[k].k,tr[k].h); bool pd=0; if(dx>tr[k].k) { if(w>mid) pd=1; else swap(tr[k].k,dx),swap(tr[k].h,hi); } else { if(w>=mid+1) swap(tr[k].k,dx),swap(tr[k].h,hi),pd=1; } if(!pd) ins(tr[k].l,l,mid,dx,hi); else ins(tr[k].r,mid+1,r,dx,hi); }

相關推薦

利用線段維護

Text 之前聽lyd_729神犇講過關於李超樹的思想,大概是標記永久化一類的 要求支援動態插入直線(線段),動態查詢上/下凸殼與x=k的交點,k為整數 今天做模擬賽的時候剛好碰到一題,然而忘得差不多了 考場上自己YY了一個: 線段樹每一個區間都儲存一

P4097 [HEOI2013]Segment

print 數據 tdi name 真的 org getchar ast printf 鏈接 https://www.luogu.org/problemnew/show/P4097 https://www.lydsy.com/JudgeOnline/problem.php?

[BZOJ2402]陶陶的難題II(鏈剖分+線段維護包+分數規劃)

五行 add urn build 一行 輸入格式 for res 限制 陶陶的難題II 時間限制:40s 空間限制:128MB 題目描述 輸入格式 第一行包含一個正整數N,表示樹中結點的個數。 第二行包含N個正實數,第i個數表示xi

UVALive - 8512 線段維護線性基僅觀賞

clear main stack best Go etc c++ oid putchar 題意:給定\(a[1...n]\),\(Q\)次詢問求\(A[L...R]\)的異或組合再或上\(K\)的最大值 目前提交處於TLE狀態,原因待查 #include<iostre

[CodeForces - 678F] Lena and Queries 線段維護

d+ operator size 平面 oid == pen txt stdin    大致題意:       給出三種操作         1、往平面點集中添加一個點         2、刪除第i次添加的點         3、給出一個q,詢問平面點集中的q*x+y的最大

洛谷P4243/bzoj1558 解題報告線段維護差分+爆炸噁心的合併

題面 首先感謝這篇題解,是思路來源 看到等差數列,就會想到差分,又有區間加,很容易想到線段樹維護差分。再注意點細節,於\(A\)操作完美解決 然後就是爆炸噁心的\(B\)操作,之前看一堆題解的解釋都不怎麼明白,就自己腦補+看上面那篇題解亂搞出了個相對合理點的解釋…… 用\(0/1/2/3\)分別表示一

XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Khamovniki Problem J Stairways解題報告分塊+維護

這裡寫一個更詳細的題解吧(我還是太菜了啊)。 題目描述 有\(n(n \le10^5)\)個人依次進入一個入口,要到一個出口。入口到出口有兩條同樣長的路。每個人都有一個速度,用通行時間\(a_i(1\le a_i \le 10^6)\)表示,他可以選擇任一條路走。但是,若走這條路的前面的人比他慢的話,

Fast Arrangement 線段 維護區間最大值 lazy標記

Fast Arrangement 題意: 有一列火車同一時刻只能承載K個人,然後有Q個人要買票(給出Q組區間表示要買票的區間),(注意: 火車行駛區間為a-b的範圍),問那個人可以成功買到票(先到先得)

BZOJ 3533 [SDOI2014]向量集 (線段維護包)

動態 持久化 pla www. cmp include geo style problem 題面:BZOJ傳送門 洛谷傳送門 容易想到這樣一個結論 把每次插入向量$(z,w)$改為在坐標系內插入一個點$(z,w)$,並對這些點建出凸包。 每次詢問向量$(x,y)$的答

【BZOJ1568】[JSOI2008]Blue Mary開公司線段

ace ostream esp bzoj long scanf space 線段樹 pac 【BZOJ1568】[JSOI2008]Blue Mary開公司(李超線段樹) 題面 BZOJ 洛谷 題解 是模板題啊。 #include<iostream> #incl

【BZOJ3165】[HEOI2013]Segment線段

printf http getch ans max d+ pac math pri 【BZOJ3165】[HEOI2013]Segment(李超線段樹) 題面 BZOJ 洛谷 題解 似乎還是模板題QwQ #include<iostream> #include&l

bzoj-1492 貨幣兌換Cash (1)——平衡維護

ota scan efi mod 結構 inf borde -a 中序 題意: 有n天和m的初始金錢,用來購買AB兩種紀念券; n天裏每天都有AB的價格。每天能夠進行這種操作。 1.賣出手中x%的紀念券(AB分別都賣出x%)。 2.用x的金錢買入紀念券。買入AB券的比例

BZOJ 1492 貨幣兌換 cdq分治或平衡維護

hid osi this hidden left javascrip 一個 display block 題意:鏈接 方法:cdq分治或平衡樹維護凸包 解析: 這道題我拒絕寫平衡樹的題解,我僅僅想說splay不要寫掛,insert邊界條件不要忘。

【BZOJ3638】Cf172 k-Maximum Subsequence Sum 線段區間合並模擬費用流

font uil sin upper sample dex else name etc 【BZOJ3638】Cf172 k-Maximum Subsequence Sum Description 給一列數,要求支持操作: 1.修改某個數的值 2.讀入l,r,k,詢問

線段狀數組單點操作

容易 當前 AI CA src http 開始 搜索 異或運算 考慮一個無限完整的二叉搜索樹(參見下圖),節點中的數字是1,2,3,....在根節點為X的子樹中,我們可以通過重復獲得該子樹中的最小數量沿著左邊的節點往下走,直到最後一層,我們也可以通過沿著右邊的節點找到最大數

hdu3074 線段求區間乘積單點更新

題意:       給你n個數,兩種操作,(1) 把第b個數改成c (2)算出b-c的乘積,結果對1000000007取餘。 思路:       線段樹單點更新,簡單題目,不多解釋,具體看程式碼。

牛客多校訓練第一場H-Longest Path(點分治+)

題意:         一顆有邊權的樹,對於一條路徑(u,v),假設經過的邊權為e1,e2,e3,...efe1,e2,e3,...ef,則該路徑權值cal(u,v)為(e2−e1)2+(e3−e2)2+...+(ef−ef−1)2(e2−e1)2+(e3−e

LCT維護資訊資訊LCT LCT維護邊權邊權LCT 知識點講解

扯淡(前言) 眾所周知LCT可以支援關於點權的鏈修改,換根,LINK,CUT和查詢鏈資訊操作,但是總有那麼些神犇(毒瘤)出題人會讓你在支援鏈修改,換根,LINK和CUT操作的情況下去支援子樹查詢,或者

關於可持久化線段的一些研究連結串列實現

    本人蒟蒻一隻……近日終於弄懂了可持久化線段樹的一些東西……寫下來分享一下=w=     首先要談可持久化線段樹,你肯定得懂線段樹吧。這裡就不提線段樹了……可持久化線段樹是什麼東西呢?就是對線段樹的葉子節點做m次修改,同時做n次詢問,但這些詢問會問你的東西是做了第i次

[1-4] 把時間當做朋友笑來Chapter 4 【開拓我們的心智】 摘錄

還要 機會 區別 led 選擇性 找不到 頁面 索引 保持 1. 獲得知識的基本途徑 所有的人獲取知識的最為基礎的手段就是“體驗”。 比“體驗”再高級一點的獲取