CSP S 2019 樹上的數(樹上推理)

2022-05-01 04:57:10 字數 2209 閱讀 2400

過了這麼久看看自己要多久才能切這題,發現還是想歪了一次。

先考慮暴力的做法。

還是貪心的逐位確定,逐位確定判有沒有解,相當於下面的問題:

樹上有一些路徑,一條路徑表示要把\(x\)的數字換到\(y\)去,問有沒有解。

對於一條路徑\(p[1],p[2],…,p[m]\),限制如下:

1.\((p[1],p[2])\)是\(p[1]\)的所有相鄰邊中時間最小的。

2.\((p[[m-1],p[m])\)是\(p[m]\)的所有相鄰邊中時間最大的。

3.\(\forall i\in [1,m-2],(p[i],p[i+1])和(p[i+1],p[i+2])\)在\(p[i+1]\)的所有相鄰邊中時間是相鄰的(前小於後)。

發現所有限制都是對於乙個點的相鄰邊的,因為是樹,所以不同點之間的相臨邊限制不會影響。

那麼只看每個點的相鄰邊是否有滿足條件的解。

暴力的做法就是先把3限制的縮成若干段段(段內要合法),然後若\(t(i),則\(i->j\)連邊,看有沒有環就好了。

仔細思考,除了3限制就只有最小最大限制,那麼可以總結為以下幾個限制:

1.每一段是合法的(不能有反向邊、跨越邊)

2.min前面不能有小於它的

3.max後面不能有大於它的

4.min、max若處於一段,則這一段的長度必須是中轉點的度數

複雜度沒怎麼變,一共要check\(o(n^2)\)次,每次\(o(n)\)。

考慮對於每一位,不去列舉它選什麼,而是先求它能選什麼,再從中選最小的。

假設第\(?\)位的起點是\(x\),以它為根,dfs一遍,處理上面四條限制,就可以求出每個點能不能作為終點了!

需要並查集維護段,時間複雜度:\(o(t*n^2α)\)

code:

#pragma gcc optimize(2)

#include#define fo(i, x, y) for(int i = x, _b = y; i <= _b; i ++)

#define ff(i, x, y) for(int i = x, _b = y; i < _b; i ++)

#define fd(i, x, y) for(int i = x, _b = y; i >= _b; i --)

#define ll long long

#define pp printf

#define hh pp("\n")

using namespace std;

const int n = 4005;

int t;

int n, x, y, a[n], ia[n];

int fi[n], nt[n], to[n], tot;

void link(int x, int y)

void cl()

int m;

int us[n], b[n];

int l[n], r[n], f[n], siz[n], du[n];

int f(int x)

void bin(int x, int y)

}int pd(int x, int y)

int mi[n], mx[n];

int rt, fa[n], fq[n], ok[n], ok_ed[n];

void dg(int x) else

int u = fq[x] ^ 1;

ok_ed[x] = 1;

if(mx[x] && mx[x] != u) ok_ed[x] = 0; else

if(r[u]) ok_ed[x] = 0; else

if(pd(u, mi[x]) && siz[f(u)] != du[x]) ok_ed[x] = 0;

} for(int i = fi[x]; i; i = nt[i])

}void gao(int x, int y)

mi[x] = fq[y];

}void work()

fo(i, 1, n) du[i] = 0;

fo(i, 1, n - 1)

fo(i, 1, tot)

fo(i, 1, n) us[i] = 0;

for(m = 1; m <= n; m ++)

} if(n == 1) b[1] = 1;

fo(i, 1, n) pp("%d ", b[i]); hh;

}int main()

}

CSP S 2019 樹的重心 重心

題意 給定一棵樹 測試資料中樹的結點數中告知 求斷掉每條邊兩棵子樹所有重心的編號和之和。題解 重心 樹狀陣列 先隨便求個重心出來,記做 k 子樹大小記為 sz 子結點子樹大小的最大值記為 mx 考慮乙個結點 u not k 首先,割掉一條邊使得 u 成為所在連通塊的重心,這條邊一定不在 u 子樹內。...

CSP S 2019 遊記 完結

day 12 to day 5 不知道哪根筋不對了,臨近csp,考試居然天天寫掛暴力,心態一天比一天 於是為了練碼力 退役前留個紀念,開始寫各種大模擬和資料結構 豬國殺寫了三天,總耗時6h 線段樹的資料結構題寫了四天,總耗時9h splay的資料結構題 不好意思我太懶了 csp應該不會考平衡樹所以不...

CSP S 2019 考試分析

考試前幾天心情比較浮躁,一些題目要調個兩三天,還有許多模板題打不對,看來注定涼涼 我們考場的時間又比別的考場時間長?8 10 就給密碼了哎 匆匆看了一眼 t1 剛開始覺得是 dp 吧,發現資料有點大,dp 陣列都開不下,然後手動模擬了一下覺得是一道找規律,試了幾組資料貌似找到了規律,然後按著規律碼了...