中文題~~
由於 n 只有 20,考慮二進位制列舉操作的行
因此我們只需預處理出對行進行 i 操作後,零列的個數,記為 cnt[i].
先求出列狀態為 i 的列的個數,記為 cnt2[i] 中.
那麼 cnt[i] = sum(cnt2[i 的子集]).
例如求出列狀態數 cnt2[00], cnt2[01], cnt2[10], cnt2[11] 後,那麼
cnt[00] = cnt2[00]
cnt[01] = cnt2[00] + cnt2[01]
cnt[10] = cnt2[00] + cnt2[10]
cnt[11] = cnt2[00] + cnt2[01] + cnt2[10] + cnt2[11].
很明顯求出 cnt2 後,再求子集字首和即可.
比如輸入為:那麼列狀態分別為 0011、0100、1100、11001
4 4 2 3
*...
*...
.***
..**
立即推 cnt2[0011] = 1, cnt2[0100] = 1, cnt2[1100] = 2.
假設對行 3,4 進行操作,那麼行操作狀態為 1100.
考慮進行行操作 1100 後,哪些列會變為零列,那麼 m - 零列個數 便為還需的列運算元.
易知進行行操作 1100 後,列狀態為 0000、0100、1000、1100 的列都會變為零列.
因此進行行操作 1100 後,零列個數便為 cnt2[0000] + cnt2[0100] + cnt2[1000] + cnt2[1100].
即進行行操作 i 後,零列個數便為
子集字首和
#includeusing namespace std;
typedef long long ll;
const int m = (int)1e5;
const int n = (int)2e1;
char s[n + 5][m + 5];
int cnt[1<
int main()
for(int i = 0; i < n; ++i)//子集字首和
bool flag = 0; for(int i = 0; i < (1<
puts(flag ? "yes" : "no");
}return 0;
}
牛客小白月賽23 A 膜法記錄(貪心 列舉)
題目傳送 用貪心的思想,先將行全部消滅,在判斷列有多少,和b比較一下。每一行可以消或不消,列舉2 n。include include include using namespace std const int maxm 1e5 5 int n,m,a,b,flag char map 30 maxm ...
二進位制列舉 思維 牛客小白月賽23 A題 膜法記錄
題目描述 牛牛最近在玩一款叫做 膜法記錄 的遊戲,這個遊戲的機制是這樣的 在一局遊戲中,所有的敵人都排布在乙個 n 行 m 列的網格中,牛牛指揮著他的魔法少女對敵人進行攻擊。攻擊有兩種型別 行blast,列blast 行blast能消滅一整行的敵人,列blast能消滅一整列的敵人 牛牛總共能夠釋放 ...
牛客小白月賽23 B 階乘
給定乙個正整數 p 求乙個最小的正整數 n,使得 n 是 p 的倍數 第一行輸入乙個正整數t表示測試資料組數 接下來t行,每行乙個正整數p 輸出t行,對於每組測試資料輸出滿足條件的最小的n 412 48124 4這題要用到質因數分解,題解用了二分,其實用不用無所謂,首先,我們知道階乘是幾個數的乘積,...