C - +/- Rectangle
Time limit : 2sec / Memory limit : 256MB
Score : 700 points
Problem Statement
You are given four integers: H, W, h and w (1≤h≤H, 1≤w≤W). 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≤h≤H≤500
- 1≤w≤W≤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 (i, j) element of the matrix.
Sample Input 1
3 3 2 2
Sample Output 1
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.
Sample Input 2
2 4 1 2
Sample Output 2
No
Sample Input 3
3 4 2 3
Sample Output 3
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 "); continue; } else printf("Yes "); 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(" "); else printf(" "); } } } return 0; }