2021.10.2 QBXT
10.2
目錄補題
得分情況
0 + 50 + 10 + 30 = 90
T1 3665: 植樹
二分 + 貪心
考慮 check 不斷的找最左邊的樹 找到需要澆水的樹之後將這棵樹能覆蓋的位置的樹刪除 然後繼續迭代
T2 3666: 敏感詞
字串雜湊 用 \(map\) 存一下 直接判斷
複雜度 \(O(10m)\) 可過
T3 3667: 樹樹修剪
在一棵樹上擷取一棵子樹 使得分最高
dp
\(f_u\) 表示以 \(u\)
在每個點對 \(f_v\) 從大到小排序 貪心的找 \(k\) 個 設 \(i\) 表示所有的 \(f_v\) 中第 \(i\) 大的值
\[f_u = \max \left ( \sum_{i = 1}^k f_i + s_{i + 1} \right) \]複雜度一隻 \(\log\) 來自排序
T4 3668: 簡單的資料結構題
kru 重構樹 從大到小建樹 向上找到走不動的最後一個點 這個點在重構樹中能走到的所有點都是符合要求的點
在原樹上限制只能向下走
通過兩個 \(dfs\) 序完成上面兩個限制
原樹上維護 \(dfs\) 序 限制該點子樹的區間
kru 重構樹上維護 \(dfs\) 序限制該點所能到達的點
問題轉化為二維數點問題 再加上時間一維 三維偏序問題 CDQ 分治可做
搜尋
搜尋
P0
給定正整數序列 求有多少種不同的方法在其中選三個數 滿足 \(a_i + a_j = a_k\)
\(n \leq 5000, a_i \leq 10^5\)
倒著列舉 \(j\) 開桶統計 \(k\)
考慮 \(n \leq 5 \times 10^4\) 考慮對序列分塊 如果一個三元組有兩個在同一個塊中 直接暴力做 否則...
棄療++
當 \(n\) 更大的時候
分塊 FFT???
棄療++
P1
列舉個 \(P\) 再列舉 \(Q\) 在 \(S - P\) 中
子集列舉
P2 P1123
暴力
\(O(2^{nm}nm)\)
搜尋
剪枝
可行性剪枝: 如果當前狀態中已經選取了相鄰的元素 直接 \(return\)
P3 P1784
剪枝
維護三個陣列 表示每個數在每行每列每個九宮格里面已經用過的 如果一個點沒法填數了 直接 \(return\)
人類智慧: 如果某行某列某九宮格空格子比較少 先去搜
一般剪枝方法
可行性剪枝
最優性剪枝
P4 P1559
可行性剪枝 匹配過的人不在匹配
最優性剪枝 假設之後沒有匹配的人都匹配上最優的搭檔 仍達不到當前最優答案 \(return\)
P5 CF-Gym 100503B
剪枝
如果一個 \(run\) 裡面 所有未填的數都按照最小的數 比限定的和大 減掉
如果一個 \(run\) 裡面 所有未填的數都按照最大的數 比限定的和大 減掉
P6 CF292C
找出所有合法的迴文串 對每個合法迴文串搜尋 \(ip\) 地址的劃分
找回文串 列舉長度和前一半的值
搜尋的一些技巧
不一定按照從小到大的順序來搜每個變數的值
將變數的確定順序加入搜尋 也可以隨機打亂
P7 P3959
考慮用一個序列描述一棵樹 \(u_0, (p_1, v_1), (p_2, v_2)...\) 表示以 \(u_0\) 為根 \(u_i\) 的 \(par\) 為 \(p_i\)
將這個序列的每個元素看做變數
...
P8 P5758
直接列舉爆炸
剪枝
先列舉加好 乘號 等號的對應 確定每個數的位數
預估左右兩邊的數位進行剪枝
在搜數位
預估左右兩邊的數字大小進行剪枝
...
迭代加深
以 \(bfs\) 寫 \(dfs\)
P10 POJ3134
迭代加深
\(dfs\) 與 \(bfs\)
空間只需要維護走到當前狀態的棧 和 \(dfs\) 一樣
時間比 \(bfs\) 稍差 會重複搜尋
可以剪枝
記搜
...
爬山/退火
3-set
...
題目
絕地反擊
傳奇糰子師傅
P1731
P1092
P1526
P4518
水題出題人
TASKSAUTHOR