1. 程式人生 > 其它 >「USACO 2021 US Open」題目選做1

「USACO 2021 US Open」題目選做1

Abstract

XC 說最近要我們把 USACO 的月賽題刷一遍,所以就開了這個坑。

United Cows of Farmer John G

\(\texttt{last}_i,\texttt{next}_i\) 分別為第 \(i\) 頭奶牛前、後第一個與它品種相同的奶牛的指標。

列舉合法區間的左端點 \(i\),顯然右端點只能在區間 \((i,\texttt{next}_i)\) 內。

\(i<j<\texttt{next}_i\),則 \(j\) 是合法的右端點的充要條件為 \(\texttt{last}_j<i\)

於是我們就將這題轉化為了一道主席樹的板子題。

Portals G

將每個點 \(u\) 拆成兩個點 \(u_1,u_2\)\(u_1\) 與邊 \(p_{u,1},p_{u,2}\) 相連,\(u_2\) 與邊 \(p_{u,3},p_{u,4}\) 相連。

因為拆除來的所有點度數均為 2,所以建出來的圖的每個連通塊都是一個環,而我麼需要將所有環連起來。

對於點 \(u_1,u_2\),若它們分屬兩個不同的連通塊,我們可以以 \(c_u\) 的代價將這兩個連通塊合併。

所以我們借鑑 Kruskal 演算法的思想,將每個點對 \(c_u\) 從大到小排序,依次考慮每個點拆除來的兩個點當前是否在同一連通塊中,若否,將 \(c_u\) 計入答案,再將這兩個連通塊合併即可,用並查集實現。

Permutation G

對於一個排列,它的前三個點連成 1 個三角形,第 4 個點要麼在三角形內部,要麼與前三個點中的 2 個連成的三角形包含了第 3 個點;

更一般的,第 \(k+1(k>3)\) 個點要麼在前 \(k\) 個點中的三個點所構成的三角形內部,要麼與前 \(k\) 個點中的 2 個點構成的三角形包含了其他 \(k-2\) 個點。

\(f_{T}\) 表示填完了三角形 \(T\) 內部的所有點,在 \(T\) 外的點的合法排列數。

轉移考慮一個更大的三角形 \(T'\),它與 \(T\) 有 2 個公共點,設在 \(T\) 外的點有 \(x\) 個,在 \(T'\)

的點有 \(y\) 個,則有 \(x-y-1\) 個點在 \(T\)\(T'\) 之間。

\(T\)\(T'\) 之間的點有 \(P(x-1,x-y-1)\) 種排列方式,\(T'\) 之外的點有 \(f_{T'}\) 種排列方式,根據乘法原理,\(f_{T'}\)\(f_T\)\(P(x-1,x-y-1)f_{T'}\) 的貢獻。

考慮每個合法排列的前 3 個點,答案即為 \(\sum_{T}3!f_T=6\sum_{T}f_T\)

United Cows of Farmer John P

考慮一個具有啟發性的 \(\mathcal O(n^2)\) 演算法:列舉合法區間的右端點 \(r\),再列舉在區間 \((\texttt{last}_r,r)\) 內的左端點 \(l\),顯然 \(l\) 對答案的貢獻為 \(l\) 是否在該區間重複乘上區間 \([l+1,r-1]\) 的不同的奶牛的品種數。

\(\mathcal O(n\log n)\) 的演算法中,我們依舊列舉合法區間的右端點 \(r\),我們發現每個左端點對答案的貢獻可拆為一個 0/1 係數與某個值相乘,寫一個線段樹維護之。

本文來自部落格園,作者:Gauss0320,轉載請註明原文連結:https://www.cnblogs.com/Gauss0320/p/15145263.html