CSP2019 Emiya 家今天的飯

2022-05-02 01:54:14 字數 844 閱讀 9631

題面:luogu

題解:容斥+dp

首先題意是這樣的:

給乙個\(n\times m\)的矩陣,每一行只能選乙個,每一列選的總數不能超過選的總數的一半。求總方案數

考慮容斥:總方案數減去不合法方案數

總方案數顯然:設每一行的總數為\(sum_i\)

\[ans=\prod_^ (sum[i]+1)-1

\]減一是因為不能不做乙個菜

由於不合法的列必然只有乙個,所以我們列舉這一列\(col\)

設\(f_\)表示前\(i\)行在\(col\)列中選了\(j\)個,其他列中選了\(k\)個

則\[f_=f_+a_f_+(sum[i]-a_)f_

\]\[ans-=\sum_f_

\]複雜度是\(o(mn^3)\),可以獲得\(84pts\)

其實我們並不關心\(j,k\)的具體數字,所以我們可以壓縮成\(j-k\)這乙個下標

但是考慮到會有負數,所以直接平移\(n\)

這樣的複雜度是\(o(mn^2)\)的

#includeusing namespace std;

templateinline void read(t& x)

#define maxn 105

#define p 998244353

long long f[maxn][maxn*2];

int n,m,c[maxn][maxn*20],sum[maxn];

long long ans=1;

int main()

printf("%lld\n",ans-1);

return 0;

}

csp2019 Emiya家今天的飯

作為提高組d2t 1d2t1 d2t1 比去年難 所以這道題我打的特別的差 這道題我們很顯然可以看到可以打乙個暴力 複雜度o n n o n n o n n 我考場上就達到了這裡 我太菜了 void dfs int u,ll plus dfs u 1,plus rep i,1 m if a u i ...

CSP2019 Emiya 家今天的飯

鏈結 顯然根據性質最多的菜品不超過總數量的一半,可以考慮補集轉化 即計算有乙個菜品超過數量一半的方案數,再用總方案數減 總方案數顯然可以乙個揹包搞定 然而我去年就是因為總方案數沒求對掛了 然後考慮求超過一半的方案數 列舉當前哪個菜品是超過一半的 有乙個顯然的dp f 表示當前到第i行最多的菜品選了j...

csp2019 Emiya家今天的飯題解

qwq 由於窩太菜了,實在是不會,所以在題解的幫助下過掉了這道題。寫此部落格來整理一下思路 傳送簡化一下題意 現在有 n 行 m 列數,選 k 個數的合法方案需滿足 1.一行最多選乙個 2.一列最多選 lfloor frac rfloor 個數 當然,如果你在某一行裡選了0,就相當於沒有在這一行裡選...