luogu P5291 十二省聯考2019 希望

2022-02-05 01:11:30 字數 1649 閱讀 8714

luogu

loj

無論最終結果將人類歷史導向何處

\(\quad\)我們選擇

\(\quad\quad\)

\(\large\)

誒我跟你講,這題超修鹹的

下面稱離連通塊內每個點距離不超過\(l\)的點為中心點.首先可以注意到,所有連通塊的共同的中心點一定是個連通塊,所以可以寫乙個暴力狀壓,表示中心點狀態為\(s\)的方案數,然後隨便列舉乙個連通塊轉移即可

暴力**

中心點是連通塊很煩,考慮轉化一下.其實答案為只考慮中心點為乙個點的方案減去只考慮中心點為一條邊上的兩個點的方案,因為考慮任意乙個連通塊,在算中心點為乙個點會算點數\(n\)次,在算中心點為一條邊會算邊數\(m\)次,然後又有連通塊一定滿足\(n-m=1\),所以這樣算每個連通塊都會被算一次

先考慮中心點為乙個點,設\(f_\)表示在\(x\)子樹內,包含\(x\),且到\(x\)最遠距離不超過\(l\)的連通塊個數,轉移就是\(f_=\prod_ (f_+1)\),就是每個點兒子可選或不選,然後還要設\(g_\)表示不包含\(x\)子樹其他點,包含\(x\),且到\(x\)最遠距離不超過\(l\)的連通塊個數轉移是\(g_=g_\prod_ (f_+1)\).那麼這個點的貢獻就是\((f_g_)^k\).一條邊也類似,只不過注意兩個到中心點的距離都要\(\le l\),所以是\((f_(g_-1))^k\)

這個暴力是\(o(nl)\)的,不過因為下標和深度有關,所以可以長鏈剖分優化.\(f\)的話,乙個點先繼承重鏈狀態,然後輕兒子暴力乘上去.注意第二維大於輕兒子第二維最大值(也就是\(y\)往下最多能延伸多深,假設是\(dep_y\))的部分,是要乘上\(f_\)的,所以還要支援字尾乘,用個可持久化線段樹維護即可(因為要算g要還原每個\(x\)的dp值)

然後就是\(g\),首先重鏈,重兒子直接繼承當前節點狀態.對於輕兒子,看上去要轉移的狀態比較多,不過可以注意到乙個東西,就是乙個點\(x\)有用的\(g\)的第二維的範圍是\([l-dep_x,l]\),那麼只要轉移這些範圍就好了,複雜度是\(\sum\)輕兒子的\(dep\),所以複雜度也是對的.注意轉移到兒子時要扣掉自己本身的貢獻,乙個想法是用所有兒子\(f\)的乘積乘上自己\(f\)的逆元,但是自己的\(f\)是有可能為0的,所以轉化成字首積乘字尾積的形式,字尾積可以在做的時候維護

然後那個可持久化線段樹有個log,很不優秀.然後我們又發現字首積其實在做的時候已經求過了,所以我們只要開個棧棧序撤銷合併的操作就得到字首積.然後那個字尾乘也可以看做是全部乘乙個值然後字首乘上逆元,所以考慮維護dp陣列的乘法標記\(a\)和加法標記\(b\),我們在dp陣列上存值\(x\),然後真實值應該是\(ax+b\),每次字尾乘\(c\),直接給\(a\)和\(b\)乘上\(c\),然後前面的值暴力改成\((ax+b-bc)(ac)^\).還有就是可能\(c=0\),那麼在維護賦值標記\(pl,nm\),表示下標為\(pl\)之後的值都是\(nm\),每次把\(nm\)改成\(-b*a^\)即可

不過逆元的問題還是沒解決.我們發現要求逆元的值一定是\(f_\),那麼可以參考階乘求逆元,先把字首積搞出來,然後求出最後一項的逆元,然後用字首積遞推出就可以算出每個數的逆元

差不多了,然後剩下的就看你的了(逃

十二省聯考 貳 壹玖

之前大假期集訓的時候好像做過,但是已經忘了,可能是水過去的 做之前建議先做一下noi2010超級鋼琴,跟這道題的思路是一樣的 要求的是這若干個區間貢獻的前 k 大,不妨列舉每乙個左端點,用 rmq 超級鋼琴 或者可持久化 01trie 異或粽子 維護出貢獻最大的右端點,放到乙個大根堆裡,堆裡每個元素...

十二省聯考2019 遊記

在機房呆了一天,大概看了看原先寫過的題,有點頹。下午的時候和大家一起打掃了一下機房。走的時候,看著空無一字的黑板,風吹起的棕黃色窗簾,遠方的藍色天空,有一種很濃厚的哀傷。時間過得真快啊,轉眼就是省選了呢。許是要退役了吧?許是要退役了吧。下午去試機了,感覺鍵盤不太星啊。考場倒是換了乙個地方 但是不讓我...

春節十二響 十二省聯考2019

給定一顆樹,要求將其上的節點分成若干組,使得每一組的節點互相不擁有祖先 後代關係。定義每一組的值為該組節點權值最大值,求值總和最小值。硬上不是很顯然的貪心,但是資料中鏈的情況給了提示。考慮鏈的情況 對於根節點兩側的鏈,我們分別排序,然後覆蓋選取即可。這個貪心的正確性是顯然的。現在考慮完整的資料 對於...