P15417 「yrOI R1」彼时蓝星题解
P15417 「yrOI R1」彼时蓝星
题目背景

题目描述
给你一个 n×mn \times mn×m 的网格,你需要在网格上放置若干个国际象棋中的王,使得每个王的攻击范围内有且仅有 111 个王。
你需要构造使得你放置王的数量最多,如果有多种方案,给出任意一种方案即可。
注:国际象棋中的王的攻击范围为距离它切比雪夫距离为 111 的格子。
输入格式
第一行一个数 TTT,代表数据组数。
接下来 TTT 行每行两个数 n,mn,mn,m,代表一次查询。
输出格式
对于每组数据,第一行一个数代表最多放置的王的个数。
接下来输出一个 nnn 行 mmm 列的 01 串 aaa,如果 ai,j=1a_{i,j}=1ai,j=1,则表示在 (i,j)(i,j)(i,j) 放置了一个王。
如果你的答案的第一个数正确,你将会得到该测试点 20%20\%20% 的分数。注意:请一定在后面输出一个方案(尽管可能是不合法的)。
输入输出样例 #1
输入 #1
3
2 2
3 4
3 3
输出 #1
2
10
10
6
1101
0001
1100
4
110
000
110
说明/提示
【数据范围】
本题开启捆绑测试。
- Subtask 1(5 pts):1≤n,m≤41 \le n,m \le 41≤n,m≤4。
- Subtask 2(5 pts):1≤n,m≤101 \le n,m \le 101≤n,m≤10。
- Subtask 3(5 pts):n=1n=1n=1。
- Subtask 4(5 pts):n=2n=2n=2。
- Subtask 5(5 pts):无特殊限制。
对于所有数据,1≤T≤1051 \le T \le 10^51≤T≤105,1≤n,m,∑nm≤1061 \le n,m,\sum nm \le 10^61≤n,m,∑nm≤106。
思路
直接写即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t,n,m,op=0,op2=0;
vector<vector<long long>> f,g;
int main(){
cin>>t;
while(t--){
cin>>n>>m;
f.resize(n+1);
for(int i=1;i<=n;i++){
f[i].resize(m+1);
}
swap(n,m);
g.resize(n+1);
for(int i=1;i<=n;i++){
g[i].resize(m+1);
}
swap(n,m);
op2=0;
if(n==1){
cout<<(n*m+1)/3*2<<endl;
if(m==1){
cout<<0<<endl;
continue;
}
for(int i=1;i<=m;i++){
if(i%3!=0&&(i!=m||(i-1)%3!=0)){
cout<<1<<"";
}
else{
cout<<0<<"";
}
}
cout<<endl;
for(int i=1;i<=n;i++){
f[i].clear();
}
f.clear();
continue;
}
if(n==2){
cout<<(m+1)/2*2<<endl;
for(int i=1;i<=m;i++){
if(i%2==1){
cout<<1<<"";
}
else{
cout<<0<<"";
}
}
cout<<endl;
for(int i=1;i<=m;i++){
if(i%2==1){
cout<<1<<"";
}
else{
cout<<0<<"";
}
}
cout<<endl;
for(int i=1;i<=n;i++){
f[i].clear();
}
f.clear();
continue;
}
if(m==1){
cout<<(n*m+1)/3*2<<endl;
if(n==1){
cout<<0<<endl;
continue;
}
for(int i=1;i<=n;i++){
if(i%3!=0&&(i!=n||(i-1)%3!=0)){
cout<<1<<endl;
}
else{
cout<<0<<endl;
}
}
for(int i=1;i<=n;i++){
f[i].clear();
}
f.clear();
continue;
}
if(m==2){
cout<<(n+1)/2*2<<endl;
for(int i=1;i<=n;i++){
if(i%2==1){
cout<<1<<"1"<<endl;
}
else{
cout<<0<<"0"<<endl;
}
}
for(int i=1;i<=n;i++){
f[i].clear();
}
f.clear();
continue;
}
op=0;
op=0;
if(n%2==1){
if(m%3==2){
op=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i%2==1&&j%3!=0){
op++;
f[i][j]=1;
}
else{
f[i][j]=0;
}
}
}
}
else if(m%3==1){
op=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i%2==1&&j%3!=0&&j!=m){
op++;
f[i][j]=1;
}
else{
f[i][j]=0;
}
}
}
for(int i=1;i<=n;i++){
if(i%3!=0&&(i!=n||(i-1)%3!=0)){
op++;
f[i][m]=1;
}
else{
f[i][m]=0;
}
}
}
else{
op=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m-4;j++){
if(i%2==1&&j%3!=0){
op++;
f[i][j]=1;
}
else{
f[i][j]=0;
}
}
}
for(int i=1;i<=n;i++){
if(i%3!=0&&(i!=n||(i-1)%3!=0)){
op+=2;
f[i][m]=f[i][m-2]=1;
}
else{
f[i][m]=f[i][m-2]=0;
}
}
}
}
else{
if(m%3==2){
op=0;
for(int i=1;i<=n-3;i++){
for(int j=1;j<=m;j++){
if(i%2==1&&j%3!=0){
op++;
f[i][j]=1;
}
else{
f[i][j]=0;
}
}
}
for(int i=1;i<=m;i++){
if(i%2==1){
op+=2;
f[n-1][i]=1;
f[n][i]=1;
}
else{
f[n-1][i]=0;
f[n][i]=0;
}
}
}
else if(m%3==1){
op=0;
for(int i=1;i<=n-3;i++){
for(int j=1;j<=m;j++){
if(i%2==1&&j%3!=0&&j!=m){
op++;
f[i][j]=1;
}
else{
f[i][j]=0;
}
}
}
for(int i=1;i<=n;i++){
if(i%3!=0&&(i!=n||(i-1)%3!=0)){
op++;
f[i][m]=1;
}
else{
f[i][m]=0;
}
}
for(int i=1;i<=m-2;i++){
if(i%2==1){
op+=2;
f[n-1][i]=1;
f[n][i]=1;
}
else{
f[n-1][i]=0;
f[n][i]=0;
}
}
}
else{
op=0;
for(int i=1;i<=n-3;i++){
for(int j=1;j<=m-4;j++){
if(i%2==1&&j%3!=0){
op++;
f[i][j]=1;
}
else{
f[i][j]=0;
}
}
}
for(int i=1;i<=n;i++){
if(i%3!=0&&(i!=n||(i-1)%3!=0)){
op+=2;
f[i][m]=f[i][m-2]=1;
}
else{
f[i][m]=f[i][m-2]=0;
}
}
//f[n-2][m-2]=f[n-2][m]=f[n-1][m-2]=f[n-1][m]=0;
if(n%3==0){
f[n-2][m-2]=f[n-2][m]=f[n-1][m-2]=f[n-1][m]=0;
f[n-2][m-1]=f[n-2][m]=f[n][m-1]=f[n][m]=1;
for(int i=1;i<=m-3;i++){
if(i%2==1){
op+=2;
f[n-1][i]=1;
f[n][i]=1;
}
else{
f[n-1][i]=0;
f[n][i]=0;
}
}
}
else{
for(int i=1;i<=m-4;i++){
if(i%2==1){
op+=2;
f[n-1][i]=1;
f[n][i]=1;
}
else{
f[n-1][i]=0;
f[n][i]=0;
}
}
}
}
}
if(f[n][m]==0&&f[n][m-1]==0&&f[n-1][m-1]==0&&f[n-1][m]==0&&f[n][m-2]==0&&f[n-1][m-2]==0){
f[n][m]=f[n][m-1]=1;
op+=2;
}
if(f[n][m]==0&&f[n-1][m]==0&&f[n-1][m-1]==0&&f[n][m-1]==0&&f[n-2][m]==0&&f[n-2][m-1]==0){
f[n][m]=f[n-1][m]=1;
op+=2;
}
swap(n,m);
if(n%2==1){
if(m%3==2){
op2=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i%2==1&&j%3!=0){
op2++;
g[i][j]=1;
}
else{
g[i][j]=0;
}
}
}
}
else if(m%3==1){
op2=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i%2==1&&j%3!=0&&j!=m){
op2++;
g[i][j]=1;
}
else{
g[i][j]=0;
}
}
}
for(int i=1;i<=n;i++){
if(i%3!=0&&(i!=n||(i-1)%3!=0)){
op2++;
g[i][m]=1;
}
else{
g[i][m]=0;
}
}
}
else{
op2=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m-4;j++){
if(i%2==1&&j%3!=0){
op2++;
g[i][j]=1;
}
else{
g[i][j]=0;
}
}
}
for(int i=1;i<=n;i++){
if(i%3!=0&&(i!=n||(i-1)%3!=0)){
op2+=2;
g[i][m]=g[i][m-2]=1;
}
else{
g[i][m]=g[i][m-2]=0;
}
}
}
}
else{
if(m%3==2){
op2=0;
for(int i=1;i<=n-3;i++){
for(int j=1;j<=m;j++){
if(i%2==1&&j%3!=0){
op2++;
g[i][j]=1;
}
else{
g[i][j]=0;
}
}
}
for(int i=1;i<=m;i++){
if(i%2==1){
op2+=2;
g[n-1][i]=1;
g[n][i]=1;
}
else{
g[n-1][i]=0;
g[n][i]=0;
}
}
}
else if(m%3==1){
op2=0;
for(int i=1;i<=n-3;i++){
for(int j=1;j<=m;j++){
if(i%2==1&&j%3!=0&&j!=m){
op2++;
g[i][j]=1;
}
else{
g[i][j]=0;
}
}
}
for(int i=1;i<=n;i++){
if(i%3!=0&&(i!=n||(i-1)%3!=0)){
op2++;
g[i][m]=1;
}
else{
g[i][m]=0;
}
}
for(int i=1;i<=m-2;i++){
if(i%2==1){
op2+=2;
g[n-1][i]=1;
g[n][i]=1;
}
else{
g[n-1][i]=0;
g[n][i]=0;
}
}
}
else{
op2=0;
for(int i=1;i<=n-3;i++){
for(int j=1;j<=m-4;j++){
if(i%2==1&&j%3!=0){
op2++;
g[i][j]=1;
}
else{
g[i][j]=0;
}
}
}
for(int i=1;i<=n;i++){
if(i%3!=0&&(i!=n||(i-1)%3!=0)){
op2+=2;
g[i][m]=g[i][m-2]=1;
}
else{
g[i][m]=g[i][m-2]=0;
}
}
for(int i=1;i<=m-4;i++){
if(i%2==1){
op2+=2;
g[n-1][i]=1;
g[n][i]=1;
}
else{
g[n-1][i]=0;
g[n][i]=0;
}
}
}
}
if(g[n][m]==0&&g[n][m-1]==0&&g[n-1][m-1]==0&&g[n-1][m]==0&&g[n][m-2]==0&&g[n-1][m-2]==0){
g[n][m]=g[n][m-1]=1;
op2+=2;
}
if(g[n][m]==0&&g[n-1][m]==0&&g[n-1][m-1]==0&&g[n][m-1]==0&&g[n-2][m]==0&&g[n-2][m-1]==0){
g[n][m]=g[n-1][m]=1;
op2+=2;
}
swap(n,m);
if(op>=op2){
cout<<op<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<f[i][j]<<"";
}
cout<<endl;
}
}
else{
cout<<op2<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<g[j][i]<<"";
}
cout<<endl;
}
}
// cout<<op<<endl;
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<f[i][j]<<"";
// }
// cout<<endl;
// }
for(int i=1;i<=n;i++){
f[i].clear();
}
f.clear();
swap(n,m);
for(int i=1;i<=n;i++){
g[i].clear();
}
g.clear();
swap(n,m);
}
return 0;
}

浙公网安备 33010602011771号