膜法記錄(牛客小白月賽23 A,子集字首和)

2021-10-04 06:17:03 字數 1270 閱讀 2331

中文題~~

由於 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 後,再求子集字首和即可.

比如輸入為:

1

4 4 2 3

*...

*...

.***

..**

那麼列狀態分別為 0011、0100、1100、1100

立即推 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這題要用到質因數分解,題解用了二分,其實用不用無所謂,首先,我們知道階乘是幾個數的乘積,...