cojs 自己出的題目 解題報告

2022-05-31 06:54:09 字數 1701 閱讀 2827

省選成功成為河北b隊隊長qaq 真是憂桑

所以在cojs上出了一套鬼畜的關於樹的套題

黑白樹:

我們先不考慮r操作

設x是u的祖先,那麼fa(x)的貢獻顯然是 fa(x)*(sz(fa(x))-sz(x))

之後我們對於這個求和就是答案辣

然而這一臉不可做,我們化簡一下,考慮每個sz(x)的貢獻

sz(x)的貢獻化簡後可以發現 為 (x-fa(x))*sz(x)

然後我們就很容易用樹鏈剖分完成更改和查詢操作啦

之後我們考慮r操作

因為樹上距離公式為 dis(u)+dis(v)-2*dis(lca(u,v))

最後一項為偶數,顯然對奇偶性沒有影響

那麼當dis(u)為奇數時,這個操作等價於將所有dis值為偶數的點翻轉

dis(u)為偶數時同理

又注意到對於r操作最多隻會有4種形態

奇偶都不翻,奇偶都翻,奇翻偶不翻,奇不翻偶翻

不妨建立四顆線段樹分別維護這四種形態

每次更改將四顆線段樹都更改,查詢在對應情況下查詢即可

這樣r操作我們可以o(1)的更換查詢的線段樹進而完成更改

樹黑白:

這套題中最水的一道 目前為止我知道兩種做法

第一種做法是動態點分治

對於每一層的重心維護子樹中黑點到他的距離和和子樹黑點個數

還要維護子樹中黑點到他父親的距離

這樣每次查詢我們只需要加上當前層的貢獻,減去父親層的貢獻就可以啦

更改的時候暴力更改相關的子樹就可以了

第二種做法是樹鏈剖分

樹上距離公式dis(u)+dis(v)-2*dis(lca(u,v))

顯然sigma(dis(u))和tot*dis(v)我們都是已知量

問題就變成了維護dis(lca(u,v))

我們考慮每條邊的貢獻,設這條邊的邊權為w,兒子一端為x

那麼貢獻就是w*sz(x)

用樹鏈剖分維護即可,做法跟黑白樹差不多

樹白黑:

首先我們考慮如果沒有[l,r]的做法

我們可以用dfs序+樹狀陣列維護子樹和

每次修改單點加減

之後對於查詢我們從查詢點向上倍增

跳到離u最近的祖先且子樹和不為0的位置

這個位置顯然就是答案

之後我們發現子樹和是具有可減性的

那麼做法就很顯然了,用dfs序+主席樹維護

繼續沿用上面的做法就可以了

白黑樹:

資料很難做,最後也做得不是很成功

我們考慮樹鏈剖分

對於每次修改,我們可以將u到根節點所有值+1或者-1

這樣我們會發現父親節點的值一定》=孩子節點的值

而當父親節點的值》孩子節點的值的時候,顯然存在乙個黑點和當前點的lca為這個父親節點

我們定義這樣的情況為乙個分界點,那麼顯然我們要求的是深度最小的分界點

可以發現這個分界點一定是u到根節點路徑中的最大值的位置

當然值相同的點我們要取深度較大的點

之後我們就可以利用樹鏈剖分完成鏈修改和鏈查詢了

upd_1:神一樣的lyc提供了一種更好的做法

我們會發現深度最小的lca的子樹一定恰好包含所有黑點

那麼問題就是求離u最近的包含所有的黑點的祖先

跟樹白黑一樣倍增即可

upd_2:這樣子的話和樹白黑一樣也可以加大這道題目的難度

可以把解法變成主席樹之類的奇怪的東東

不過資料就更加難出了,所以還是這樣子吧

cojs 西瓜 解題報告

首先我們要知道pick公式 設二維平面內任意多邊形面積為s 設多邊形內部整點數為a 設多邊形邊界的整點數為b 則滿足s a b 2 1 變形得a s b 2 1 由期望的線性性質我們把問題轉化為 1 求凸包面積的期望 2 求凸包邊界整點數的期望 首先我們考慮如何算面積,對於任意凸多邊形,我們可以以原...

搜尋題目推薦及解題報告

搜尋題目推薦及解題報告 8.28更新 2008 06 28 14 31 以前的帖子要麼太分散,要麼太凌亂,故現在開始,對每乙個分類做乙個長期更新的彙總貼。格式說明 題目名後面列出個人此題的大致難度 對菜鳥而言 poj 1069 the bermuda 難 題意 用給定三角型填充六邊形 解法 此題的思...

cojs 簡單的01串 題解報告

題意顯然是求n位二進位制串中不大於其逆序串,取反串,逆序取反串的所有串按字典序排序後的第k個 由於n很小,k很大所以我們可以考慮逐位確定 問題轉化為了求方案數,這顯然是可以用數字dp做的 設f len rev inv 表示當前字首長度為len,rev表示是否等於其逆序串,inv表示是否等於其逆序取反...