題目大意:參考這篇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...