吉利題..
不難發現,置換中的每乙個迴圈是獨立的,每乙個迴圈分別對應乙個獨立的聯通塊。
根據題目的性質,每乙個聯通塊做的事情等價於其按照編號從小到大遍歷的的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 獲得某個類的所有宣告...