This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
map <pair<int,int>,int> arr;
int vreme;
ll n, m, k;
int color(pair<int,int> start, pair<int,int> kraj)
{
if (kraj.fr <= start.fr or kraj.sc <= start.sc)
{
return 0;
}
vreme ++;
for (int i=start.fr; i<=kraj.fr; i++)
{
arr[{i,start.sc}] = vreme;
arr[{i,kraj.sc}] = vreme;
}
for (int j=start.sc; j<=kraj.sc; j++)
{
arr[{start.fr,j}] = vreme;
arr[{kraj.fr,j}] = vreme;
}
return 1;
}
int normal(pair<int,int> start, pair<int,int> kraj)
{
int ret = 0;
for (int i=start.fr; i<kraj.fr; i+=2)
{
for (int j=start.sc; j<kraj.sc; j+=2)
{
ret++;
vreme++;
arr[{i,j}] = vreme;
arr[{i+1,j}] = vreme;
arr[{i,j+1}] = vreme;
arr[{i+1,j+1}] = vreme;
}
}
return ret;
}
bool solve_with_4_vertical (pair<int,int> start, pair<int,int> kraj, int req)
{
//cout<<start.fr<<" "<<start.sc<< " "<<kraj.fr<<" "<<kraj.sc<<"\n";
for (int i=start.fr-1; i<=kraj.fr; i+=2) /// i is horizontal direction
{
if (i-start.fr==1)
{
continue;
}
if (req == (kraj.fr-start.fr+1) -((i-start.fr+1)/2))
{
color({start.fr,start.sc}, {i, kraj.sc});
normal({start.fr+1,start.sc+1}, {i-1,kraj.sc-1});
normal({i+1, start.sc}, {kraj.fr, kraj.sc});
return true;
}
}
return false;
}
bool solve_with_4 (pair<int,int> start, pair<int,int> kraj, int req)
{
//cout<<start.fr<<" "<<start.sc<< " "<<kraj.fr<<" "<<kraj.sc<<"\n";
for (int i=start.sc-1; i<=kraj.sc; i+=2) /// i is horizontal direction
{
if (i-start.sc==1)
{
continue;
}
if (req == (kraj.sc-start.sc+1) -((i-start.sc+1)/2))
{
color({start.fr,start.sc}, {kraj.fr, i});
normal({start.fr+1,start.sc+1}, {kraj.fr-1,i-1});
normal({start.fr, i+1}, {kraj.fr, kraj.sc});
return true;
}
}
return false;
}
bool solve(pair<int,int> start, pair<int,int> kraj, int req)
{
if (req<(kraj.sc-start.sc+1)/2 or req<(kraj.fr-start.fr+1)/2)
{
return false;
}
if (kraj.sc<=start.sc + 1 or kraj.fr<=start.fr + 1)
{
return false;
}
if (req == (kraj.fr - start.fr+1)*(kraj.sc-start.sc+1)/4)
{
normal({start.fr, start.sc},{kraj.fr, kraj.sc});
return true;
}
else if (req > (kraj.fr - start.fr+1)*(kraj.sc-start.sc+1)/4)
{
return false;
}
if (kraj.fr - start.fr + 1== 4)
{
if (solve_with_4(start, kraj, req))
{
return true;
}
else
{
return false;
}
}
if (kraj.sc - start.sc + 1 == 4)
{
if (solve_with_4_vertical(start, kraj, req))
{
return true;
}
else
{
return false;
}
}
for (int i=start.fr + 3; i<=kraj.fr; i+=2)
{
for (int j=start.sc + 3; j<=kraj.sc; j+=2)
{
int plostina = (kraj.fr-start.fr+1)*(kraj.sc - start.sc+1) - (j+1-start.sc)*2 - (i-1-start.fr)*2;
int plostina_in = (i-start.fr-1)*(j-start.sc-1);
int plostina_out = plostina - plostina_in;
int sq = 1 + plostina/4;
if (sq == req)
{
color({start.fr, start.sc},{i, j});
normal({start.fr+1, start.sc+1}, {i-1, j-1});
normal({i+1, start.sc}, {kraj.fr, kraj.sc});
normal({start.fr, j+1},{i, kraj.sc});
return true;
}
if (sq == req + 2)
{
if ((i-start.fr-1)>2 and (j-start.sc-1)>2)
{
req -= color({start.fr, start.sc},{i, j});
req -= normal({i+1, start.sc}, {kraj.fr, kraj.sc});
req -= normal({start.fr, j+1},{i, kraj.sc});
return solve({start.fr+1, start.sc+1}, {i-1, j-1}, req);
}
}
}
}
color(start, kraj);
return solve({start.fr+1, start.sc+1}, {kraj.fr-1, kraj.sc-1}, req -1);
}
int main()
{
int t;
cin>>t;
while (t>0)
{
t--;
vreme = 0;
bool ok = false, swapped = false;
cin>>n>>m>>k;
if (n>m)
{
swap(n, m);
swapped = true;
}
if (n%2 ==1 or m%2==1)
{
cout<<"NO\n";
continue;
}
if (n*m/4 < k)
{
cout<<"NO\n";
continue;
}
if (k==n*m/4)
{
normal({0,0},{n-1, m-1});
ok = true;
}
else if (n==2)
{
if (k == m/2)
{
normal({0,0},{n-1,m-1});
ok = true;
}
}
else if (n==4)
{
if (solve_with_4({0, 0}, {n-1, m-1}, k))
{
ok = true;
}
}
else
{
if (solve({0,0},{n-1,m-1},k))
{
ok = true;
}
}
if (ok)
{
cout<<"YES\n";
if (swapped)
{
for (int j =0; j<m; j++)
{
for (int i=0; i<n; i++)
{
cout<<arr[{i,j}]<<" ";
}
cout<<"\n";
}
}
else
{
for (int i =0; i<n; i++)
{
for (int j=0; j<m; j++)
{
cout<<arr[{i,j}]<<" ";
}
cout<<"\n";
}
}
continue;
}
else
{
cout<<"NO\n";
}
}
}
Compilation message (stderr)
Main.cpp: In function 'bool solve(std::pair<int, int>, std::pair<int, int>, int)':
Main.cpp:139:17: warning: unused variable 'plostina_out' [-Wunused-variable]
139 | int plostina_out = plostina - plostina_in;
| ^~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |