見面會EX dp 斜率優化 單調佇列

2021-09-17 07:24:15 字數 1905 閱讀 9425

題目大意:參考這篇blog,但是資料範圍是1e7。

題解:這題居然有線性做法是真的秀……

就是這個題不能直接線性的原因是斜率優化沒辦法支援刪除資訊,因此需要用分治/線段樹等來去掉刪除。

然後有乙個黑科技:

考慮將序列劃分為若干段,使得不存在乙個轉移區間同時和至少三個段有交。

劃分方法是,由於轉移區間端點是不降的,因此就是從左端點開始能向右就向右,可以發現這樣劃分是正確的。

這樣有什麼好處呢?會發現乙個轉移區間是由一段的字尾和一段的字首拼起來的!

然後就可以分開轉移,每一種情況都可以線性。然後這個題就線性了。

#include

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define rep(i,v) rep(i,0,(int)v.size()-1)

#define lint long long

#define ull unsigned lint

#define db long double

#define pb push_back

#define mp make_pair

#define fir first

#define sec second

#define debug(x) cerr<<#x<<"="<#define sp <<" "

#define ln typedef pair<

int,

int> pii;

typedef set<

int>

::iterator sit;

namespace input_space

inline

intinn()

}using input_space:

:inn;

const

int n=

300010

;const lint inf=llong_min/

100;

const db eps=

1e-9

;int vl[n]

,vr[n]

,l[n]

;namespace getl

return0;

}}inline

intdcmp

(db x)

struct line

inline lint operator()

(lint x)

const

inline db getis

(const line &l)

const};

struct queue

inline

intadd

(line f)

inline lint query

(lint x)

}q;int l[n]

,r[n]

;lint f[n]

;int

main()

f[0]=

0;rep(i,

1,n) f[i]

=inf;

rep(i,

1,bc)

q.clear()

;rep

(j,l[i]+1

,r[i]+1

) q.

add(

line(-

(j-1

),f[j-1]

+(j-

1ll)

*j/2))

,f[j]

=max

(f[j]

,q.query

(j)+j*

(j-1ll)/

2);}

return

!printf

("%lld\n"

,f[n]);

}

整理 斜率or單調佇列優化dp

題意 求乙個序列的子區間滿足長度大於k且所有數平均值最大 周源 裡的題。之前有人說周源講的是錯的 其實應該是沒什麼問題的 可以o n 求出 不過這題hdu上的資料不知道怎麼了 反正我在網上找的ac 們全都tle。總之 意思明白就好 反正也是入門題 include include include in...

單調佇列與斜率優化雜題

hdu3530 subsequence 給定乙個序列,求滿足 a leq max min leq b 的最長的子串行 n leq10 6 維護遞增遞減兩個單調佇列,若兩隊首之差大於 b 挪動較小左端點,並更新答案左端點 時間複雜度 o n poj1180 ioi2002 batch scheduli...

LA 4726 斜率優化 單調佇列

題意 給定乙個01序列,選乙個長度至少為l 的連續子串行使其平均值最大 輸出這個子串行的起點和終點 如果有多個答案,輸出長度最小的,還有多個就輸出第乙個編號最小的 思路 用sum i 表示 1,i 的和 題目的平均值就可以變成 sum i sum j 1 i j 1 問題也變成求橫座標的距離至少為l...