查稅 斜率優化 單調佇列維護凸包 分塊 )

2021-07-04 11:49:51 字數 1754 閱讀 8508

id3167

有n個辦公室,m個操作,依次讀入

type

如果type為1 , 接著讀入 t k z s , 表示乙個公司於t時刻進駐k辦公室,每天盈利為z,其一開始有s元。若k位置本有別的公司,別的公司會被覆蓋。

如果type為2 , 接著讀入t a b 表示於t時刻,你要找出區間[a,b]內,最有錢的公司的錢數。(關於錢的值都可以為負)

若ab內無公司輸出「nema」

每次操作t不相同。n−

−√) 的 。

我們把直線的引數k,b看做是二維平面bok上的點。每個塊互不影響地插入塊上的直線 。

我們可以發現本題有個單調性,若某兩條直線y=

k1x+

b1,y=k

2x+b

2 。設k1

, 如果你b1

也還小於b2

。l1 就根本沒有保留的價值了。

插入的話,刪除原來在那個位置的直線,重構整個塊(好暴力啊)

以k為關鍵字公升序排序塊內元素。構造乙個單調佇列,從隊尾加元素,其實根據上述單調性,我們發現是在乙個二維平面上維護乙個上凸殼。叉積維護凸性即可。

對於詢問,若乙個塊沒有被詢問區間包含,暴力地掃出答案。其餘被包含的塊可以維護單調佇列隊首元素,保證隊首最優(判斷條件即kl

x+bl

+1x+

bl+1

-> ++l)

問題得以解決

**

#include

#include

#include

#include

using namespace std ;

#define n 100010

#define srn 351

typedef long long ll ;

int n , m , i , j , k , t ;

const int inf = 210000000 ;

struct point a[n] ;

ll operator *( point a , point b )

point operator -( point a , point b )

struct block b[srn] ;

point tmp[n] ;

struct for_brute y[n] ;

ll min( ll a , ll b )

ll max( ll a , ll b )

int main()

for( i=1 ; i<=n ; i++ ) a[i].ps = i , a[i].k = inf , y[i].k = inf ;

while( m-- ) else tmp[l] = a[j++] ;

}for( j=b[i].st ; j<=b[i].en ; j++ ) a[j] = tmp[j] ;

int r = 1 ;

l = 1 ;

b[i].q[1] = b[i].st ;

b[i].q[2] = b[i].st + 1 ;

if( a[ b[i].q[2] ].k!=inf && b[i].st + 1

<= b[i].en )

}b[i].l = l , b[i].r = r ;

} else else

}if( ans==-100000000000000ll ) puts("nema" ) ; else

printf("%lld\n",ans ) ;}}

}

凸殼上的單調佇列 斜率優化

一 性質 一種動態規劃的優化。二 前置 dp 單調佇列。三 適用 dp i a i b j c i d j a i 單調遞增。四 方法 移項 a i b j dp i a i d j 把 b j 看作 x 把 d j 看作 y 把 a i 看作 k kx dp i a i y 此直線過 x,y 且斜...

小明打聯盟 斜率 單調佇列 優化dp 揹包

題目描述 小明很喜歡打遊戲,現在已知乙個新英雄即將推出,他同樣擁有四個技能,其中三個小技能的釋放時間和固定的傷害值為 他還有乙個大招,其釋放的時間是乙個區間 l,r 可以在區間內任意時間點釋放出技能,其如果在l i時刻釋放技能,其能夠打出的傷害值為 temp a i 這裡temp值表示技能的基礎傷害...

懶人的福利 教你用set維護斜率優化凸包

斜率優化題目大家肯定都做得不少了,有一些題目查詢插入點的x座標和查詢斜率都不單調,這樣就需要維護動態凸包並二分斜率。例如bzoj1492 常規的做法是cdq分治或手寫平衡樹維護凸包,然而如果我不願意寫分治,也懶得打平衡樹,怎麼辦呢?沒關係,今天我告訴你怎麼用乙個set維護這種凸包。首先orzlh,沒...