Codeforces Round #140 (Div. 1) D. The table 构造

D. The table

题目连接:

http://www.codeforces.com/contest/226/problem/D

Description

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.

Sample Input

4 1
-1
-1
-1
-1

Sample Output

4 1 2 3 4
0

Hint

题意

给你一个n*m的矩阵,矩阵元素的数字绝对值小于等于100,你可以使得一行或者一列的所有数取反

然后让你构造一个解,使得每一行每一列的和都是非负数

题解:

显然,我们可以随便搞一搞(雾

我们直接看到负的行,直接翻转就好了,看见负的列也直接翻转

这样最多翻转100^4次,是可以过的。

为什么呢?

因为你翻转一次,可以使得整个矩阵的和至少+2

然后矩阵的和为[-10000,10000],所以最多n*100^4的复杂度

然后水一水就过了

来自主代码手的冬令营构造题选讲

代码

#include<bits/stdc++.h>
using namespace std;

int mp[120][120];
int sumx[120];
int sumy[120];
int ans1[120];
int ans2[120];
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("%d",&mp[i][j]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            sumx[i]+=mp[i][j];
            sumy[j]+=mp[i][j];
        }
    }
    while(1)
    {
        int flag = 0;
        for(int i=1;i<=n;i++)
        {
            if(sumx[i]<0)
            {
                for(int j=1;j<=m;j++)
                {
                    sumy[j]=sumy[j] - 2*(mp[i][j]);
                    mp[i][j]=-mp[i][j];
                }
                ans1[i]^=1;
                sumx[i]=-sumx[i];
                flag = 1;
            }
        }
        if(flag)continue;
        for(int j=1;j<=m;j++)
        {
            if(sumy[j]<0)
            {
                for(int i=1;i<=n;i++)
                {
                    sumx[i]=sumx[i] - 2*(mp[i][j]);
                    mp[i][j]=-mp[i][j];
                }
                ans2[j]^=1;
                sumy[j]=-sumy[j];
                flag = 1;
            }
        }
        if(flag==0)break;
    }
    int Ans1=0;
    for(int i=1;i<=110;i++)
    {
        if(ans1[i])
        Ans1+=1;
    }
    int Ans2=0;
    for(int i=1;i<=110;i++)
    {
        if(ans2[i])
        Ans2+=1;
    }
    cout<<Ans1<<" ";
    for(int i=1;i<=110;i++)
        if(ans1[i])cout<<i<<" ";
    cout<<endl;
    cout<<Ans2<<" ";
    for(int i=1;i<=110;i++)
        if(ans2[i])cout<<i<<" ";
    cout<<endl;
}

你可能感兴趣的:(Codeforces Round #140 (Div. 1) D. The table 构造)