用bitset写,容易理解
读入01串,修改时改变对应位置
#include<iostream>
#include<cstdio>
#include<bitset>
#include<algorithm>
typedef long long ll;
using namespace std;
inline long long read() { long long s = 0, w = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') w = -1; for (; isdigit(ch); ch = getchar()) s = (s << 1) + (s << 3) + (ch ^ 48); return s * w; }
enum { maxn = 10 };
bitset<maxn> a[maxn];
int n, m, t;
bitset<maxn> temp1, temp2;
int main() {
n = read(), m = read();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
a[i] <<= 1;
t = read();
a[i] |= t;
}
}//读入01串
int op, x1, x2, y1, y2;
while (m--) {
op = read();
x1 = read();
y1 = read();
if (op == 1) { a[x1 - 1][n-y1] = ~a[x1 - 1][n-y1];//对应位置直接取反
//cout << "After change:" << endl;
//for (int i = 0; i < n; ++i) cout << a[i]<<endl;
}
else {
x2 = read(), y2 = read();
temp1.reset();
temp1 = temp2 = ~temp1;
if (y1 > y2) swap(y1, y2);
temp1 <<= n-y2, temp2 <<= n-y1+1;
temp2 = (~temp2) & temp1;
//对于每一列,把所求区间置为1,后面直接位运算&+bitset::count()可以获取这一行对应区间1的个数
int ans = 0;
//cout << "temp2=" << temp2 << endl;
//cout << "count matraix:" << endl;
for (int i = x1 - 1; i <= x2 - 1; ++i) {
ans += (a[i] & temp2).count();
//cout << (a[i] & temp2) << "\t" << (a[i] & temp2).count() << endl;
}
cout << ans << endl;
}
}
return 0;
}
京公网安备 11010502036488号