太久沒做題了,看著有牛客就打了一場,果然自閉…
題目大意也很明確,給定乙個長度為n,初始全為0的樹組。給定以下兩種操作:
思維退化太快。開始老是想著建乙個可持久化的,或者怎瞎搞,發現複雜度都降不下來。後來絕處逢生,想到了將所有的操作倒著做,記錄每乙個操作被後面的操作總共引用了多少次,完美解決。複雜度也能過。
最絕望的來了,由於太久沒寫題,導致樹狀樹組的意義都忘了,一邊吃飯一邊調樹狀樹組,調了乙個小時左右,終於調過了樣例。然後馬上交了一發,果不其然的wa了。此時距離比賽結束還有十幾分鐘,最後果不其然的涼了。
最後wa的地方對於當時的我來說可能確實有點難看出來(但是樣例卻神奇的過了),第二天對著別人的**debug才發現**出了錯(在下方的**中標註了)…
#include
using
namespace std;
const
int n=
1e5+5;
const
int mod=
1e9+7;
int tr[n]
,p[n]
;inline
intlowbit
(int x)
void
add(
int*tr,
int x,
int d)
intquery
(int
*tr,
int x)
int opt[n]
,l[n]
,r[n]
;int
main()
for(
int i=
1;i<=m;i++
)for
(int i=m;i>=
1;i--
)else
/* 開始的寫法:
if(opt[i]==1)
else
這樣顯然是不行的,因為前面在更新的時候會改變當前tr[i]的值
*/}for
(int i=
1;i<=n;i++
)return0;
}
複雜度顯然只有o(n
logn
)o(nlogn)
o(nlog
n)
牛客練習賽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 筱瑪愛閱讀 子集dp 桶判斷
筱瑪愛閱讀 題是好題,但我不會 定義d p i dp i dp i 為取出書狀態為i ii時的最大免費值 但是每本書的 是自己選定的,無法dpdp dp但是仔細觀察發現每本書並無區別 只會在最終方案存在一次 所以我們考慮dp i dp i dp i 會怎樣被更新 c nt i cnt i cnt i...
牛客練習賽49 solution
水題 有15本書,和15個 你要分配這15個 使得總價最小.此外,有一些 方案,每個方案是一些書的集合,表示只要買全了這個方案的書,則最便宜的一本書免費 你最後選擇的所有方案不能有重複的書.第一感覺就是狀壓dp 了 首先二進位制列舉子集,對於每個當前狀態,考慮可以從哪些狀態轉移過來,這時候再列舉他的...