省選集訓2022 模擬賽11

2022-09-24 00:33:11 字數 2075 閱讀 2590

題目描述

\(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 ...