選舉選
舉des
on 設
f[i]
表示前i
個選民的
最優答案
,得到f
[i]=
maxf[j]+1\ \ \ \ \ \ \ \ \ (sum_i>sum_j) \\
f[j] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (sum_i=sum_j)\\
f[j]-1\ \ \ \ \ \ \ \ \ (sum_i設f
[i]表
示前i個
選民的最
優答案,
得到f[
i]=m
ax⎩⎪
⎨⎪⎧
f[j]
+1(s
umi
>su
mj)
f[j]
(sum
i=s
umj
)f[j
]−1(
sumi
mj)
複雜度 o(n
2)o(
n2).
優化部分
:優化部
分:以 sumn
sumn
為下標建立權值線段樹,
線段樹的每個葉子節點儲存 滿足s
umi=
葉子下標
滿足su
mi=
葉子下標
的每個 i
i 位置上的 最大f
值最大f
值.則可以直接查詢比當前 sum
isum
i值小的,大的,相等的最大的 f[j
]f[j
], o(l
ogn)
o(lo
gn) 實現單次轉移.
每次 i++
i++前, i−l
+1i−
l+1 可以被合法轉移, i−r
+1i−
r+1p
dp值.bugco
deco
de
#include
#define reg register
typedef std::pair<
int,
int> pr;
intread()
while
(isdigit
(c)) s = s*
10+ c-
'0', c =
getchar()
;return s * flag;
}const
int maxn =
1e6+6;
const
int inf =
0x3f3f3f3f
;int n;
int l;
int r;
int lim;
int a[maxn]
;int f[maxn]
;int sum[maxn]
;struct node t[maxn*4]
;void
build
(int k,
int l,
int r)
int mid = l+r >>1;
build
(k<<
1, l, mid)
,build
(k<<1|
1, mid+
1, r)
; t[k]
.max_v =
-inf;
}void
modify
(int k,
int id)
int mid = l+r >>1;
if(sum[id]
<= mid)
modify
(k<<
1, id)
;else
modify
(k<<1|
1, id)
; t[k]
.max_v = std::
max(t[k<<1]
.max_v, t[k<<1|
1].max_v);}
void
del(
int k,
int id)
int mid = l+r >>1;
if(sum[id]
<= mid)
del(k<<
1, id)
;else
del(k<<1|
1, id)
; t[k]
.max_v = std::
max(t[k<<1]
.max_v, t[k<<1|
1].max_v);}
intquery
(int k,
int ql,
int qr)
intmain()
printf
("%d\n"
, f[n]);
return0;
}/*bug list:
1. build -> push_up
2. for(int i = 1; i <= n; i ++) <
*/
資料結構 樹狀dp
整個公司的人員結構可以看作是一棵標準的多叉樹。樹的頭節點是公司唯一的老闆,除老闆外,每個員工都有唯一的直接上級,葉節點是沒有任何下屬的基層員工,除基層員工外,每個員工都有乙個或多個直接下級,另外每個員工都有乙個快樂值。這個公司現在要辦 party,你可以決定哪些員工來,哪些員工不來。但是要遵循如下的...
MySQL優化 資料結構的優化
標籤 空格分隔 mysql 乙個好的資料庫設計方案對於資料庫的效能往往會起到事半功倍的效果。需要考慮資料冗餘 查詢和更新的速度 欄位的資料型別是否合理等多方面的內容。對於欄位較多的表,如果有些欄位的使用頻率很低,可以將這些字段分離出來形成新錶。因為當乙個表的資料量很大時,會由於使用頻率低的字段的存在...
Spark效能優化 優化資料結構
1 優先使用陣列以及字串,而不是集合類。也就是說,優先用array,而不是arraylist linkedlist hashmap等集合。比如,有個list list new arraylist 將其替換為int arr new int。這樣的話,array既比list少了額外資訊的儲存開銷,還能使...