題目大意 : 給乙個排列,翻轉k次,問最終逆序對個數的期望值
然後在用兩個字首和分別優化這3種轉移就好了
show code
#include #define mod(x) ()
using namespace std;
const int n = 505, m = 1e9 + 7;
int n, k, a[n], f[n][n], s1[n][n], s2[n][n], s3[n][n], s4[n][n], s5[n][n], s6[n][n], ans, p = 1;
int pow(int a, int k, int ans = 1)
int cal(int x)
int main()
}for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
f[i][j] = (f[i][j] * (1ll * cal(i-1) + cal(j-i-1) + cal(n-j)) + s2[i][n] + s2[i][i-1] - s2[i][n+i-j] + m - s2[i][j-1] + m + s4[j-1][j] - s4[j-i-1][j] + m - s4[i-1][j] + m + s6[n][n+i-j] - s6[n-i][n-j] + m - s6[j-1][i-1] + m) % m;
p = 1ll * p * cal(n) % m;
for (int i = 1; i <= n; ++i)
for (int j = 1; j < i; ++j)
f[i][j] = mod(p - f[j][i] + m);
}for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
if ((ans += f[i][j]) >= m) ans -= m;
printf("%lld\n", 1ll * ans * pow(p, m - 2) % m);
return 0;
}
題目大意 : 定義乙個長度為k的序列b的權值是 \(\sum_^i\times b_i\),給乙個長度為n的序列問長度分別為1到n的子串行最大權值
show code
#include #define get(x) (t[fa[x]][1] == x)
using namespace std;
const int n = 1e5 + 5;
int read(int x = 0, int f = 1, char c = getchar())
int n, t[n][2], fa[n], sz[n], rt, stk[n], tp;
long long tag[n], w[n], ans;
void pushup(int x)
void rotate(int x)
void uptate(int x, long long val)
void pushdown(int x)
void splay(int x, int to = 0)
if (!to) rt = x;
}void dfs(int x)
int main()
t[lt][k] = i; fa[i] = lt; w[i] = 1ll * val * sum;
splay(i); uptate(t[i][1], val);
}dfs(rt);
return 0;
}
題目大意 :
show code
考試 省選28
t1炸了 別的沒啥。t1 k n 我就會死,窩階乘只處理到了 n 其實挺簡單的乙個題。就是要求關於某一段路徑,其兩端分別連線 k 條不相交路徑的方案。考慮乙個點,他的兒子稱為 ch i 那麼方案數的生成函式就是 f x prod limits sz ch i x 1 這個可以直接分治 ntt 來計算...
省選測試21
設 f i 為上一次參加的比賽是第 i 場的最大愉悅值 則 f i max f i f j frac a i j 對於隨機的資料,把列舉的範圍卡到 3000 即可 容易發現,如果沒有 a j leq a i 的限制,那麼就是乙個裸的斜率優化 dp 把 f i frac frac 看做 y 把 i 看...
省選測試9
這個名次已經是倒數了 感覺整場考試不是很在狀態,正解想不到,暴力分也沒有打滿 其實前兩道題仔細推一下還是能想出來的 t1 2 sat 有一段時間沒有打了 優化建圖的方式和之前的某道題挺像的,但是當時那道題沒改 這次算是補了乙個鍋 t2 的資料範圍折半列舉也不難想,實現時注意一下細節就行了 t3 有一...