題目描述
\(n\) 個城市構成一棵樹,現在要求在一些城市中設定監測點,使得每個城市可以通過到監測點的距離區分出來(不同可以知道是到哪個監測點的距離,可以模擬為樹上的座標)
給定 \(q\) 次修改,每次斷開邊 \((u,v)\) 再連上邊 \((x,y)\),然後求出最小設定的監測點數目。
解法
無根樹問題考慮定根,我們先列舉根強制根選取,那麼只有深度相同的點需要區分。設 \(f(x)\) 表示子樹 \(x\) 內設定關鍵點的數目,如果 \(x\) 有多個子樹,我們可能要在合併的時候多設定關鍵點才能區分子樹,顯然要求是至多乙個子樹內沒有關鍵點:
\[f(x)=\sum_ \max(f(y),1)-[\prod_ f(y)=0]
\]接下來就是定根的問題了,一定要去找結論(我就是憑感覺找錯了結論),考慮我們新增關鍵點的過程都是必要的,那麼如果根是度數 \(\geq 3\) 的點,那麼根是不需要選取的,並且由於其他點的選取是必要的,我們得到了最優解。
然後考慮這個修改顯然就是讓你寫 \(\tt lct\) 維護 \(\tt ddp\) 了,這題乙個很強的操作是維護分段函式。
具體來說就是自變數 \(=0\),那麼對應函式 \(a\)(一次項係數為 \(0\));自變數 \(>0\) 又對應著函式 \(b\)(一次項係數為 \(1\)),那麼函式如何合併呢?考慮兩個分段函式 \(u,v\) 按順序合併,我們把 \(v_a\) 帶入 \(u\) 的分段函式中得到新的 \(a\),由於\(f\) 是單調的,所以大於 \(0\) 之後不會再變回 \(0\),那麼新的 \(b\) 就是 \(u_b+v_b\) 了。
但是本題由於要定根所以還要寫makeroot
,所以你需要維護正序和逆序的函式。
此外注意重鏈底端的函式是沒有定義的,所以只能直接拿值,那麼我們在求某個重鏈的值時,把最低點splay
到根,然後把判斷是否有左兒子,如果有則帶值進左兒子的函式,如果沒有則用輕兒子的資訊計算。
#include #include #include #include using namespace std;
const int m = 500005;
int read()
while(c>='0' && c<='9')
return x*f;
}void write(int x)
int n,d[m],ch[m][2],fa[m],sum[m],num[m],st[m],fl[m];
multiset> s;
struct node
int get(const int &x) const
node operator & (const node &r) const
}l[m],r[m];
void up(int x)
if(ch[x][1]) }
void flip(int x)
void down(int x)
int nrt(int x)
int chk(int x)
void rotate(int x)
void splay(int x,int tar=0)
rotate(x); }}
int calc(int x,int fa=0)
void access(int x)
if(y)
splay(y);ch[x][1]=y;up(x); }}
void makert(int x)
void cut(int x,int y)
void link(int x,int y)
void add(int x)
void rem(int x)
void print()
}signed main()
for(int i=1;i<=n;i++) add(i);
int q=read();print();
while(q--)
}
省選集訓2022 模擬賽6
題目描述 定義長度為 n 的好串 s 滿足 給你長度為 n 的序列 a 和 v 分別表示原序列和價值序列。你每次可以選擇乙個原序列中的好串,將其刪除之後剩下的串會前後拼接。設這次刪除的長度是 l 那麼會得分 v l 問最大得分,不一定要把原序列刪完。n leq 400,v i leq 10 5,a ...
省選集訓2022 模擬賽8
題目描述 給定乙個 n times m 的 01 矩陣,對於矩陣的每乙個位置,你需要對於這個位置上的值反轉,然後求出這個矩陣的秩的變化 0 可以將這個矩陣看成 n 個大小為 0,2 m 的數,秩就是它們線性基的大小。n,m leq 1000 解法 我們判斷求出原先的 n 個向量在原來的線性基中是可以...
省選集訓2022 模擬賽10
題目描述 給定 n 個元素,每個元素有兩個屬性值 a i,b i 我們可以將其以任意順序排列,要最大化下式 min a i i cdot k max b i i cdot k n leq 10 5,a i,b i,kn leq 10 9 解法 應該是遇到困難退大火才對,直接使用列舉法,考慮列舉 m ...