日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 2018多校8

發布時間:2024/1/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 2018多校8 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

A.Character Encoding?簡單計數

m個非負數和等于k的方案數為$\binom{m+k-1}{k}$, 但題目還要求每個數小于n, 容斥一下即可

即$ans =?\sum\limits_{0\le i \le m}(-1)^i\binom{m}{i}\binom{m+k-1-ni}{k}$

?

B.Pizza Hub?計算幾何

貪心可以知道最優情況三角形一定有一個頂點與矩形頂點重合, 暴力枚舉判斷一下即可

?

C. 不會

?

D.Parentheses Matrix 貪心

假設行列都為偶數, 因為奇數很容易特判. 再假設n>m, 我們假設初狀態是每行全匹配, 再逐步調整到最優.

首先注意到第一列和最后一列顯然不能動, 再考慮中間列的情況, 這里可以分兩種情況討論:

1, 保證每行都匹配

這樣的話顯然中間列匹配的上界為n+m/2-1,?手畫一下很容易達到這個上界.

2, 不保證行匹配

這樣的話, 手畫一下可以發現, 通過破壞第一行和最后一行可以使得列全部匹配, 達到上界n+m-4.

最后取兩種情況最大值即可.

但這題交了以后竟然WA了, 找了份題解拍了下所有小于200的n和m, 沒發現是哪出鍋了....

?

E.?Magic Square 純簽到題

?

F.?不會

?

G.Make ZYB Happy 后綴自動機 (以后有時間補吧)

?

H.?Taotao Picks Apples 討論一下再二分

?

I.Pop the Balloons 狀壓

挺好的一個狀壓題, 三進制壓一下, 第i位的0表示無氣球, 1表示該位有氣球, 2表示該位扎過一個氣球

然后dp一次求出每種狀態的方案數, 最后再統計答案即可.

#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(); }

?

轉載于:https://www.cnblogs.com/uid001/p/10431114.html

總結

以上是生活随笔為你收集整理的hdu 2018多校8的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。