就暴力找需要改的那一行(列),一定会在1e6次前找到
Code:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
return res*f;
}
const int N=105;
int n,m;
int a[N][N];
int sumx[N],sumy[N];
inline int okx(){
for(int i=1;i<=n;i++) if(sumx[i]<0) return i;
return 0;
}
inline int oky(){
for(int i=1;i<=m;i++) if(sumy[i]<0) return i;
return 0;
}
int ansx[1000005],totx=0,ansy[1000005],toty=0;
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
a[i][j]=read();
sumx[i]+=a[i][j];
sumy[j]+=a[i][j];
}
while(1){
int xx=okx(),yy=oky();
if(!xx && !yy) break;
if(xx){
++ansx[xx];
sumx[xx]=0;
for(int i=1;i<=m;i++){
int v=-a[xx][i];
sumy[i]-=a[xx][i]-v;
a[xx][i]=v;
sumx[xx]+=v;
}
}
else{
++ansy[yy];
sumy[yy]=0;
for(int i=1;i<=n;i++){
int v=-a[i][yy];
sumx[i]-=a[i][yy]-v;
a[i][yy]=v;
sumy[yy]+=v;
}
}
}
for(int i=1;i<=n;i++) if(ansx[i]&1) ++totx;
for(int i=1;i<=m;i++) if(ansy[i]&1) ++toty;
cout<<totx<<" ";
for(int i=1;i<=n;i++) if(ansx[i]&1) cout<<i<<" ";
cout<<endl;
cout<<toty<<" ";
for(int i=1;i<=m;i++) if(ansy[i]&1) cout<<i<<" ";
return 0;
}