牛客練習賽49 筱瑪愛閱讀 子集dp 桶判斷

2021-10-24 12:41:53 字數 2342 閱讀 1882

筱瑪愛閱讀

題是好題,但我不會…

定義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大**的肯定沒錯

而我們列舉過程中考慮了所有優惠方案的排列,所以沒錯

#include using namespace std;

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

牛客練習賽49 筱瑪愛線段樹 思維

太久沒做題了,看著有牛客就打了一場,果然自閉 題目大意也很明確,給定乙個長度為n,初始全為0的樹組。給定以下兩種操作 思維退化太快。開始老是想著建乙個可持久化的,或者怎瞎搞,發現複雜度都降不下來。後來絕處逢生,想到了將所有的操作倒著做,記錄每乙個操作被後面的操作總共引用了多少次,完美解決。複雜度也能...

牛客練習賽49 D 筱瑪愛線段樹 差分

給定乙個長度為n n 1e5 的陣列a,剛開始每一項的值均為0。支援以下兩種操作,操作共m m 1e5 次 1 l r 將al ar的每一項的值加上1。2 l r 執行操作編號在 l,r 內的所有操作各一次,保證r小於當前操作的編號。m次操作結束後,你要告訴馬爺a陣列變成什麼樣子了。由於答案可能會很...

牛客練習賽49 solution

水題 有15本書,和15個 你要分配這15個 使得總價最小.此外,有一些 方案,每個方案是一些書的集合,表示只要買全了這個方案的書,則最便宜的一本書免費 你最後選擇的所有方案不能有重複的書.第一感覺就是狀壓dp 了 首先二進位制列舉子集,對於每個當前狀態,考慮可以從哪些狀態轉移過來,這時候再列舉他的...