考試題 排列 分治 樹形DP

2021-10-08 16:26:58 字數 1163 閱讀 6316

題意:求有多少種排列滿足 $i$ 之前第乙個小於 $i$ 的位置是 $q[i]$.  

如果沒有 $q[i]$ 的限制,答案就是全排列,然後 $q[i]$ 會限制一些元素之間的大小關係.  

直接做的話沒辦法方便地求出元素之間的大小關係.   

不妨思考單調棧的過程:如果遇到字首最小值的話肯定會將棧清空. 

那麼也就是說如果最小值 $i$ 將序列分為 $l,r$,則 $l,r$ 之間相互不影響.         

有上述結論後就可以根據最小值進行分治了,會形成乙個樹形結構.    

建出樹後令 $f[x]$ 表示以 $x$ 為根的子樹有多少種排列滿足限制,然後轉移的話乘上乙個組合數就好了. 

code: 

#include #include #include #include #define n 500008 

#define ll long long

#define mod 998244353

#define setio(s) freopen(s".in","r",stdin)

using namespace std;

int n,edges;

int fac[n],inv[n],g[20][n],q[n],lg[n],hd[n],to[n],nex[n],f[n],size[n];

void add(int u,int v)

int qpow(int x,int y)

return tmp;

} inline int get_inv(int x)

void init()

}int query(int l,int r)

int a=solve(l,now-1),b=solve(now+1,r);

if(a) add(now,a);

if(b) add(now,b);

return now;

}void dfs(int x)

++size[x];

}int main()

build();

int p=solve(1,n);

dfs(p);

printf("%d\n",f[p]);

return 0;

}

考試題 排列 分治 樹形DP

題意 求有多少種排列滿足 i 之前第乙個小於 i 的位置是 q i 如果沒有 q i 的限制,答案就是全排列,然後 q i 會限制一些元素之間的大小關係.直接做的話沒辦法方便地求出元素之間的大小關係.不妨思考單調棧的過程 如果遇到字首最小值的話肯定會將棧清空.那麼也就是說如果最小值 i 將序列分為 ...

2017 9 23 考試題二 排列

題目 排列 sum.cpp c pas 時間限制 1s 記憶體限制 256mb 問題描述 給出乙個隨機的排列,請你計算最大值減最小值的差小於等於 0 n 1 的區間分別有多少個。輸入 tyvj.cn輸入檔名為 sum.in。第一行乙個數 t 10 表示資料組數對於每一組資料 第一行乙個數 n 1 n...

考試題題解

主講人igl albl 試題t2 t3 t1 t4 t5 暴力 dfs所有路徑,在使用clock的情況下預計 text 題意 給你一張有向圖,距離為 text 的正整數次冪的兩點間可以重新連一條長為 text 邊,求在此情況下的從起點到終點最短路。我們用 text 表示點 text 到點 text ...