洛谷傳送門
眾所周知,機房的大哥是只貓……
機房的貓貓自從常住在這裡之後,引來了很多小貓來吃飯,為了方便地給小貓們投食,我們在樹上模擬出了喂貓自動機。
小貓來吃飯的路徑是乙個樹形結構。一共有 kk 只小貓,在小貓移動之前你可以任意安排他們的位置,但是這時不能有兩隻貓被放在同乙個位置上。一共會經過若干刻鐘,你一共有 pp 塊錢,每刻鐘你可以選擇某些節點放上柵欄,放柵欄的花費就是在這個點上目前有幾隻小貓。所有沒有被攔住的小貓都會在這一刻鐘走到所在點的父親節點(小貓不會連續移動)。所有被放置的柵欄在下一刻鐘就會被收走,也就是說柵欄只能作用於當前這一刻鐘。
而每一刻鐘結束處於根節點(11 號節點)的所有貓咪都可以吃到好吃的,然後他們就會離開。而在根節點吃到飯的貓咪數量就是這一刻鐘的喂貓數。
現在你想知道喂貓數最大的一刻鐘,喂貓數可以達到多少。
從檔案cat_automaton.incat_automaton.i**n中讀入資料。
第一行,33 個整數 n, k, pn,k,p,表示喂貓自動機一共有 nn 個節點,kk 只貓,你手中有 pp 塊錢。
接下來的 n-1n−1 行,每行兩個整數 u_i,v_iu**i,v**i,描述樹上的一條邊。
輸出到檔案cat_automaton.outcat_automaton.out中。
輸出一行乙個整數,在喂貓數最大的一刻鐘喂貓數可以達到多少。
時間不等人啊,當初還是萌新oi選手,現在已經快要老年退役了。
摘的去年csp前信心賽的原題。
真是一段難忘的時光。
這題給了很多自由發揮的空間,比如隨便放、隨便攔等等。所以考慮貪心而非dp,發現最優的決策一定是越來越多的人都在到達根節點之前到達同一深度,同理,那麼兩個人一開始被放置的位置深度差越大,把乙個人攔下使得另乙個人追上他的難度(花費)就越大。所以我們要盡可能地讓人們的初始深度差值最小。也就是說,我們要將其放在:按深度排序後深度相鄰的點上。
把所有點按深度排序後,假設深度為\(d\)的點有\(cnt[d]\)個放上人,所有放人的節點中深度最大的為\(d\),那麼為了讓他們達到同一深度,需要的代價就是:
\[\sum_^r (d-deep[i])
\]這樣,為了控制\(l,r\)選取的範圍,我們這裡採用雙指標法。
**:
#include#includeusing namespace std;
const int maxn=1e5+10;
int n,k,p;
int tot,head[maxn],nxt[maxn<<1],to[maxn<<1];
int deep[maxn],cnt[maxn];
void add(int x,int y)
void dfs(int x,int f)
}int main()
ans=max(ans,(r-l+1));
} printf("%d",ans);
return 0;
}
AC自動機模板 洛谷3796
ac自動機的第三個模板 其實,個人覺得,目前我寫的這三個不同的模板完全是可以合併在一起求解的。只是,在這兩個無關聯的oj上,同乙個ac自動機都可以完成的問題被拆成了三道題而已。因此,只需要略加修改即可解決這道題。具體題目請上洛谷檢視 include include include include i...
洛谷3804 模板 字尾自動機
真 玄學 還是沒有完全搞懂sam的性質啥的啊t t 我本來以為sam會很長的沒想到這麼短 這個題就是建出sam 然後建樹求出right然後 len max 直接取max即可啦 學習筆記什麼的等等吧 鴿了我也不管 附 include include include include define inf...
AC自動機 洛谷P3808 AC自動機(簡單版)
給定 n n 個模式串和1個文字串,求有多少個模式串在文字串裡出現過 多模匹配用ac role presentation aca c自動機 首先建造一棵字典樹,新增所有模式串,然後建造失配指標,最後進行匹配 luogu judger enable o2 include include include...