過了這麼久看看自己要多久才能切這題,發現還是想歪了一次。
先考慮暴力的做法。
還是貪心的逐位確定,逐位確定判有沒有解,相當於下面的問題:
樹上有一些路徑,一條路徑表示要把\(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 陣列都開不下,然後手動模擬了一下覺得是一道找規律,試了幾組資料貌似找到了規律,然後按著規律碼了...