Codeforces Round #140 (Div. 1) D. The table 无限暴力

题目链接:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值