UER 2 資訊的交換

2022-03-31 16:19:04 字數 1071 閱讀 6083

吉利題..

不難發現,置換中的每乙個迴圈是獨立的,每乙個迴圈分別對應乙個獨立的聯通塊。

根據題目的性質,每乙個聯通塊做的事情等價於其按照編號從小到大遍歷的的dfs生成樹做的事情,那麼只需要考慮一棵dfs生成樹做的事情即可。

對於一棵dfs生成樹,將每個點的兒子按照編號從小到大排序,考慮節點 \(u\) 以及它的兒子 \(v_1,v_2..v_k\) ,其中 \(v_k\) 的權值最終會到 \(u\) 的位置上,\(\forall i的值會先到 \(v_\) 的位置上去,到訪問到 \(v_i+1\) 的時候在繼續做同樣的事情,最終會到達 \(v_\) 這棵子樹最左邊的葉子上。定義逆dfs序為先遍歷編號大的兒子的dfs序,這個過程做完相當於節點 \(v\) 到了逆dfs序的前一位對應的節點上,根節點到逆dfs序上最後一位對應的節點。相當於按照逆dfs序做了乙個置換!

那麼只需要將每個迴圈對應的逆dfs序求出來,再計算有多少棵樹的逆dfs序符合。對於一棵符合的樹,其連上一些返祖邊可以得到符合的圖,大力dp一下即可,複雜度 \(\mathcal o(n^3)\) 。

code

/*program by mangoyang*/

#include #define inf (0x7f7f7f7f)

#define max(a, b) ((a) > (b) ? (a) : (b))

#define min(a, b) ((a) < (b) ? (a) : (b))

typedef long long ll;

using namespace std;

template inline void read(t &x)

const int n = 505, mod = 998244353;

int vis[n], pw[n], a[n], f[n][n], h[n][n], c[n][n], n;

inline void up(int &x, int y)

inline int gao(vector&a)

return f[0][m-1];

}int main()

cout << ans << endl;

}

UER 2 謠言的傳播

寫了個亂搞,怎麼莫名其妙就ac了,這.之後又想了30min結合題解終於會證了。首先最大值比較簡單,記 f i 為第 i 個點能到達的點數,上界 sum n f i 一定可以取到。考慮取到是這麼一件事情,如果 b x y 那麼 y 一定不能是 x 在外向樹上的祖先以及環上的節點,外向樹的根的前驅例外。...

113 UER 2 手機的生產

uoj 傳送門 蒟蒻做這個題是一懵一懵的啊。題意就好難懂!我們以 為分界線,分成若干塊。因為在每一小塊中有0這一塊的返回值就是0,在整個表示式中有某一塊的返回值為1,那整個式子就是1,剩下的塊都不用算了。只有當手機返回值為1時才能造出手機。而且在當前這塊中複製出的手機,在下一塊中才能造出其他的手機。...

交換2個Integer的資料

交換2個資料 public static void main string args throws exception 這裡雖然是引用傳遞型別,但是integer內部並沒有提供改變內部值的方法,所以可以使用反射 param a param b getdeclaredfields 獲得某個類的所有宣告...