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,沒...