AtCoder Grand Contest 016 C - +/- Rectangle

C - +/- Rectangle


Time limit : 2sec / Memory limit : 256MB

Score : 700 points

Problem Statement

You are given four integers: HWh and w (1≤hH1≤wW). Determine whether there exists a matrix such that all of the following conditions are held, and construct one such matrix if the answer is positive:

  • The matrix has H rows and W columns.
  • Each element of the matrix is an integer between −109 and 109 (inclusive).
  • The sum of all the elements of the matrix is positive.
  • The sum of all the elements within every subrectangle with h rows and w columns in the matrix is negative.

Constraints

  • 1≤hH≤500
  • 1≤wW≤500

Input

Input is given from Standard Input in the following format:

H W h w

Output

If there does not exist a matrix that satisfies all of the conditions, print No.

Otherwise, print Yes in the first line, and print a matrix in the subsequent lines in the following format:

a11  a1W
:
aH1  aHW

Here, aij represents the (ij) element of the matrix.


Sample Input 1

Copy
3 3 2 2

Sample Output 1

Copy
Yes
1 1 1
1 -4 1
1 1 1

The sum of all the elements of this matrix is 4, which is positive. Also, in this matrix, there are four subrectangles with 2 rows and 2 columns as shown below. For each of them, the sum of all the elements inside is −1, which is negative.

bbdb651fa1f05996886da9f0c4d8090a.png

Sample Input 2

Copy
2 4 1 2

Sample Output 2

Copy
No

Sample Input 3

Copy
3 4 2 3

Sample Output 3

Copy
Yes
2 -5 8 7
3 -5 -4 -5
2 1 -1 7

炒鸡麻烦的一道题,wa了无数次。思路是...额,不知道怎么说。
a1,a2分别代表大矩阵和小矩阵填正整数的格子数量,b1,b2分别代表大矩阵和小矩阵填负整数的格子数量。
ta,tb分别代表所填的正整数和负整数。
对于小矩阵来说a1*ta+b1*tb<=-1
对于大矩阵来说a2*ta+b2*tb>=1,那么假设
a1*ta+b1*tb=-(a2*ta+b2*tb),求解ta,tb。
特判1,特判1,特判1。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#define ll long long
#define pb push_back
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define cls(name,x) memset(name,x,sizeof(name))
using namespace std;
const int inf=1e9+10;
const ll llinf=1e16+10;
const int maxn=5e2+10;
const int maxm=2e5+10;
const int mod=1e9+7;
const double pi=acos(-1.0);
int H,W,h,w;
int ans[maxn][maxn];
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d %d %d %d",&H,&W,&h,&w))
    {
        if(H%h==0&&W%w==0)
        {
            printf("No\n");
            continue;
        }
        else printf("Yes\n");
        int a1,b1,a2,b2;
        if(h==1||w==1) a1=1;
        else a1=(h+w-1);
        b1=h*w-a1;
        a2=0;
        for(int i=0;i<H;i++)
            for(int j=0;j<W;j++)
            if((i%h==0&&h!=1)||(j%w==0)&&w!=1) a2++;
        b2=H*W-a2;
        int ta=b1+b2;
        int tb=-(a1+a2);
        for(int i=0;i<H;i++)
        {
            for(int j=0;j<W;j++)
            {
                if((i%h==0&&h!=1)||(j%w==0&&w!=1))
                    printf("%d",ta);
                else printf("%d",tb);
                if(j==W-1) printf("\n");
                else printf(" ");
            }
        }
    }
    return 0;
}

 

 

 

 
posted @ 2017-07-07 11:10  爱种树的码农  阅读(168)  评论(0编辑  收藏  举报