題意:求有多少種排列滿足 $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 ...