hdu 2018多校8
A.Character Encoding?簡單計數(shù)
m個非負數(shù)和等于k的方案數(shù)為$\binom{m+k-1}{k}$, 但題目還要求每個數(shù)小于n, 容斥一下即可
即$ans =?\sum\limits_{0\le i \le m}(-1)^i\binom{m}{i}\binom{m+k-1-ni}{k}$
?
B.Pizza Hub?計算幾何
貪心可以知道最優(yōu)情況三角形一定有一個頂點與矩形頂點重合, 暴力枚舉判斷一下即可
?
C. 不會
?
D.Parentheses Matrix 貪心
假設(shè)行列都為偶數(shù), 因為奇數(shù)很容易特判. 再假設(shè)n>m, 我們假設(shè)初狀態(tài)是每行全匹配, 再逐步調(diào)整到最優(yōu).
首先注意到第一列和最后一列顯然不能動, 再考慮中間列的情況, 這里可以分兩種情況討論:
1, 保證每行都匹配
這樣的話顯然中間列匹配的上界為n+m/2-1,?手畫一下很容易達到這個上界.
2, 不保證行匹配
這樣的話, 手畫一下可以發(fā)現(xiàn), 通過破壞第一行和最后一行可以使得列全部匹配, 達到上界n+m-4.
最后取兩種情況最大值即可.
但這題交了以后竟然WA了, 找了份題解拍了下所有小于200的n和m, 沒發(fā)現(xiàn)是哪出鍋了....
?
E.?Magic Square 純簽到題
?
F.?不會
?
G.Make ZYB Happy 后綴自動機 (以后有時間補吧)
?
H.?Taotao Picks Apples 討論一下再二分
?
I.Pop the Balloons 狀壓
挺好的一個狀壓題, 三進制壓一下, 第i位的0表示無氣球, 1表示該位有氣球, 2表示該位扎過一個氣球
然后dp一次求出每種狀態(tài)的方案數(shù), 最后再統(tǒng)計答案即可.
#include <iostream> #include <algorithm> #include <cstdio> #include <queue> #define pb push_back #define REP(i,a,n) for(int i=a;i<=n;++i) using namespace std; typedef long long ll;const int N = 531450; int n, m, k, t; char a[22][22], b[22][22]; int g[N][22]; int fac[22], base[3][22]; ll dp[22][N], ans[22]; vector<int> f[22];void work() {scanf("%d%d%d", &n, &m, &k);REP(i,1,n) scanf("%s", a[i]+1);if (n<m) {swap(n,m);REP(i,1,n) REP(j,1,m) b[i][j]=a[j][i];REP(i,1,n) REP(j,1,m) a[i][j]=b[i][j];}int mx = base[1][m]-1;REP(i,1,n) f[i].clear();REP(i,0,n) REP(j,0,mx) dp[i][j]=0;REP(i,1,k) ans[i]=0;REP(i,1,n) REP(j,1,m) if (a[i][j]=='Q') f[i].pb(j-1);dp[0][0] = 1;REP(i,1,n) REP(s,0,mx) if (dp[i-1][s]) {int ss = s;for (int j:f[i]) if (g[s][j]<2) {dp[i][s-base[g[s][j]][j]+base[2][j]]+=dp[i-1][s];if (!g[s][j]) ss += base[1][j];}dp[i][ss] += dp[i-1][s];}REP(s,0,mx) if (dp[n][s]) {int f = 1, cnt = 0;REP(j,0,m-1) {if (g[s][j]==1) {f=0;break;}if (g[s][j]==2) ++cnt;}if (f) ans[cnt] += dp[n][s];}ll mod = 1e12;REP(i,1,k) {__int128 t = (__int128)ans[i]*fac[i];if (t>mod) printf("%lld%012lld\n",(ll)(t/mod),(ll)(t%mod));else printf("%lld\n", (ll)t);} }int main() {fac[0]=base[1][0]=1,base[2][0]=2;REP(i,1,12) fac[i]=fac[i-1]*i;REP(i,1,12) base[1][i]=base[1][i-1]*3;REP(i,1,12) base[2][i]=base[2][i-1]*3;REP(i,0,N-1) {int t = i;REP(j,0,12) g[i][j]=t%3, t/=3;}scanf("%d", &t);REP(i,1,t) work(); }?
轉(zhuǎn)載于:https://www.cnblogs.com/uid001/p/10431114.html
總結(jié)
以上是生活随笔為你收集整理的hdu 2018多校8的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jupyter安装出现问题:安装后无法打
- 下一篇: 公司6:JrVue重用布局