和谐矩阵题解

没什么说的,
高斯消元解异或方程组,
板子要多打打,有点不熟,
\(bitset\)优化,\(O(n^{3}/64)\)
看起来是\(O(n^{2})\),不过不同行的\(bitset\)异或需要\(O(n)\)

#include<bits/stdc++.h>
using namespace std;
const int N=1606,dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int n,m,t,sx,sy,p,ans[N];
bitset<N> s[N];
int main(){
   scanf("%d%d",&n,&m),p=n*m;
   for(int i=1;i<=n;++i)
       for(int j=1;j<=m;++j){
           t=(i-1)*m+j,s[t][t]=1;
           for(int k=0;k<4;++k){
               sx=i+dx[k],sy=j+dy[k];
               if(sx<1||sx>n||sy<1||sy>m) continue;
               s[t][(sx-1)*m+sy]=1;
           }
       }
   for(int i=1;i<=p;++i){
       t=i;
       while(t<=p&&!s[t][i]) ++t;
       if(t>p){
          s[i][p+1]=1;
          for(int j=i+1;j<=p;++j) s[i][j]=0,s[j].flip(p+1);
          continue;
       }
       swap(s[t],s[i]);
       for(int j=i+1;j<=p;++j) if(s[j][i]) s[j]^=s[i];
   }
   for(int i=p;i>=1;--i){
       ans[i]=s[i][p+1];
       for(int j=i+1;j<=p;++j) if(s[i][j]) ans[i]^=ans[j];
   }
   for(int i=1;i<=n;++i){
       for(int j=1;j<=m;++j) printf("%d ",ans[(i-1)*m+j]);
       printf("\n");
   }        
   return 0;
}
posted @ 2019-10-14 21:41  lsoi_ljk123  阅读(128)  评论(0编辑  收藏  举报