题目链接:
http://codeforces.com/problemset/problem/226/D
D. The table
Harry Potter has a difficult homework. Given a rectangular table, consisting of n × m cells. Each cell of the table contains the integer. Harry knows how to use two spells: the first spell change the sign of the integers in the selected row, the second — in the selected column. Harry's task is to make non-negative the sum of the numbers in each row and each column using these spells.Alone, the boy can not cope. Help the young magician!
Input
The first line contains two integers n and m (1 ≤ n, m ≤ 100) — the number of rows and the number of columns.
Next n lines follow, each contains m integers: j-th integer in the i-th line is ai, j (|ai, j| ≤ 100), the number in the i-th row and j-th column of the table.
The rows of the table numbered from 1 to n. The columns of the table numbered from 1 to m.
Output
In the first line print the number a — the number of required applications of the first spell. Next print a space-separated integers — the row numbers, you want to apply a spell. These row numbers must be distinct!
In the second line print the number b — the number of required applications of the second spell. Next print b space-separated integers — the column numbers, you want to apply a spell. These column numbers must be distinct!
If there are several solutions are allowed to print any of them.
Examples
input
Copy
4 1 -1 -1 -1 -1
output
Copy
4 1 2 3 4 0
input
Copy
2 4 -1 -1 -1 2 1 1 1 1
output
Copy
1 1 1 4
题目大意:
给出一个矩阵,每次可以选择反转行或列,求一种合法的方案使最终的矩阵所有行的权值和和列的权值和分别大于0。
这道题可以每次贪心的选取权值为负的行或列,然后将这一行或列中的每个数取他的相反数。
需要注意到是,这道题在输出的时候只输出翻转次数为奇数次的行或列。
This is the code:
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<sstream>
#include<stack>
#include<string>
#include<set>
#include<vector>
using namespace std;
#define PI acos(-1.0)
#define pppp cout<<endl;
#define EPS 1e-8
#define LL long long
#define ULL unsigned long long //1844674407370955161
#define INT_INF 0x3f3f3f3f //1061109567
#define LL_INF 0x3f3f3f3f3f3f3f3f //4557430888798830399
// ios::sync_with_stdio(false);
// 那么cin, 就不能跟C的 scanf,sscanf, getchar, fgets之类的一起使用了。
const int dr[]={0, 0, -1, 1, -1, -1, 1, 1};
const int dc[]={-1, 1, 0, 0, -1, 1, -1, 1};
int read()//输入外挂
{
int ret=0, flag=0;
char ch;
if((ch=getchar())=='-')
flag=1;
else if(ch>='0'&&ch<='9')
ret = ch - '0';
while((ch=getchar())>='0'&&ch<='9')
ret=ret*10+(ch-'0');
return flag ? -ret : ret;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
scanf("%lld",&a[i][j]);
sum_r[i]+=a[i][j];
sum_c[j]+=a[i][j];
}
}
while(true)
{
for(int i=1; i<=n; i++)//行
{
if(sum_r[i]<0)
{
sum_r[i]=0;
for(int j=1; j<=m; j++)
{
a[i][j]=-a[i][j];
sum_r[i]+=a[i][j];
sum_c[j]=sum_c[j]-(-a[i][j])+a[i][j];
}
r[i]+=1;
}
}
for(int j=1; j<=m; j++)//列
{
if(sum_c[j]<0)
{
sum_c[j]=0;
for(int i=1; i<=n; i++)
{
a[i][j]=-a[i][j];
sum_c[j]+=a[i][j];
sum_r[i]=sum_r[i]-(-a[i][j])+a[i][j];
}
c[j]+=1;
}
}
bool flag=false;
for(int i=1; i<=n; i++)//判断是否符合题意
if(sum_r[i]<0)
flag=true;
for(int i=1; i<=m; i++)
if(sum_c[i]<0)
flag=true;
if(!flag)
break;
}
for(int i=1; i<=n; i++)
if(r[i]%2==1)
ans_r.push_back(i);
for(int i=1; i<=m; i++)
if(c[i]%2==1)
ans_c.push_back(i);
printf("%d ",ans_r.size());
for(int i=0; i<ans_r.size(); i++)
printf("%d ",ans_r[i]);
printf("\n%d ",ans_c.size());
for(int i=0; i<ans_c.size(); i++)
printf("%d ",ans_c[i]);
return 0;
}