用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; }