luogu
其實就是一顆二叉樹
我們假設左兒子小於根,右兒子大於根
考慮樹形\(dp\)
\(f[u][i]\)表示以\(u\)為根的子樹,\(u\)為第\(i\)小
那麼考慮子樹合併
其實就是兩個序列的合併
如果是左子樹
列舉\(j\)為子樹內有多少個數小於其根
那麼以\(i\)為根的子樹一定至少有\(j\)個
那麼我們換一下列舉的東西
改成列舉有多少個數小於\(u\)
剩下的問題就是分配權值的問題了
組合數計算一下(具體看**注釋)
#includeusing namespace std;
const int n = 110, mod = 1e9 + 7;
int f[n][n], g[n][n], tmp[n], n, siz[n], c[n][n];
char s[n];
struct node g[n];
int last[n], gl;
void add(int x, int y) ;
last[x] = gl;
}void pls(int &x, int y)
void dfs(int u)
return ;
}int main()
洛谷P3757 CQOI2017 老C的鍵盤
傳送門 首先可以直接把整個序列建成乙個完全二叉樹的結構,這個應該都看得出來 然後考慮樹形dp,以大於為例 設 f i j 表示 i 這個節點在子樹中排名第 j 位時的總方案數 因為實際只與相對大小有關,與實際數值無關 我們考慮如果從當前子樹中弄出 k 個節點,其他子樹中弄出 j 1 個節點,那麼當前...
洛谷P4170 CQOI2007 塗色
假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...
洛谷 P4170 CQOI2007 塗色
假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...