筱瑪愛閱讀
題是好題,但我不會…
定義d p[
i]
dp[i]
dp[i
]為取出書狀態為i
ii時的最大免費值
但是每本書的**是自己選定的,無法dpdp
dp但是仔細觀察發現每本書並無區別(只會在最終方案存在一次)
所以我們考慮dp[
i]
dp[i]
dp[i
]會怎樣被更新
c nt
[i
]cnt[i]
cnt[i]
表示狀態i
ii有cnt
[i
]cnt[i]
cnt[i]
個1
11,而**陣列a
aa從大到小排好序
ⅰ .存
在優惠方
案是i的
政策,此
時\colorⅰ.存在優惠方案是i的政策,此時
ⅰ.存在優惠
方案是i
的政策,
此時 dp[
i]=a
[cnt
[i]]
dp[i]=a[cnt[i]]
dp[i]=
a[cn
t[i]
]很明顯,取前cnt
[i
]cnt[i]
cnt[i]
個是最優的
ⅱ .使
用了某種
優惠方案
x從狀態
j轉移到
i,此時
滿足x⊕
j==i
\colorⅱ.使用了某種優惠方案x從狀態j轉移到i,此時滿足x\oplus j==i
ⅱ.使用了某
種優惠方
案x從狀
態j轉移
到i,此
時滿足x
⊕j==
i d p[
i]=d
p[j]
+a[c
nt[i
]]
dp[i]=dp[j]+a[cnt[i]]
dp[i]=
dp[j
]+a[
cnt[
i]]因為dp[
j]
dp[j]
dp[j
]肯定是把前cnt
[j
]cnt[j]
cnt[j]
大的**用掉的
又因為當前總共用了cnt
[i
]cnt[i]
cnt[i]
本書,所以目前最優的優惠是取第a[c
nt[i
]]
a[cnt[i]]
a[cnt[
i]]**的書
ⅲ .不
使用優惠
方案,單
買第j本
書轉移而
來,滿足
i&(1
<
不為 0\colorⅲ.不使用優惠方案,單買第j本書轉移而來,滿足i\&(1<ⅲ. 不使用優 惠方案, 單買第j 本書轉移 而來,滿 足i&( 1< 不為0 d p[ i]=d p[i− (1 < ]dp[i]=dp[i-(1[i]= dp[i −(1< ]一直取max maxma x即可當然你可能會質疑為什麼每次狀態i ii都取**前i ii大的? 會不會有後效性?? 沒關係,因為我們列舉了所有狀態 因為假設x xx個優惠方案總共買了k kk本書,選前k kk大**的肯定沒錯 而我們列舉過程中考慮了所有優惠方案的排列,所以沒錯 int n,m,k,sumn; int a[16],cnt[1<<16],dp[1<<16]; bool vis[1<<16]; int one(int x) return ans; }int main() vis[v]=1; } for(int i=1;i<(1 太久沒做題了,看著有牛客就打了一場,果然自閉 題目大意也很明確,給定乙個長度為n,初始全為0的樹組。給定以下兩種操作 思維退化太快。開始老是想著建乙個可持久化的,或者怎瞎搞,發現複雜度都降不下來。後來絕處逢生,想到了將所有的操作倒著做,記錄每乙個操作被後面的操作總共引用了多少次,完美解決。複雜度也能... 給定乙個長度為n n 1e5 的陣列a,剛開始每一項的值均為0。支援以下兩種操作,操作共m m 1e5 次 1 l r 將al ar的每一項的值加上1。2 l r 執行操作編號在 l,r 內的所有操作各一次,保證r小於當前操作的編號。m次操作結束後,你要告訴馬爺a陣列變成什麼樣子了。由於答案可能會很... 水題 有15本書,和15個 你要分配這15個 使得總價最小.此外,有一些 方案,每個方案是一些書的集合,表示只要買全了這個方案的書,則最便宜的一本書免費 你最後選擇的所有方案不能有重複的書.第一感覺就是狀壓dp 了 首先二進位制列舉子集,對於每個當前狀態,考慮可以從哪些狀態轉移過來,這時候再列舉他的...#include using namespace std;
牛客練習賽49 筱瑪愛線段樹 思維
牛客練習賽49 D 筱瑪愛線段樹 差分
牛客練習賽49 solution