1. 程式人生 > 其它 >2021.10.2 QBXT

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\)

為根的子樹內 欽定 \(u\)\(par_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