组合最值之主教问题 / QOJ7178 Bishops 题解
题意简述
在一个
题目解法
证明答案上界
显然可以将黑格和白格分开考虑,对于某个颜色答案有一个上界,为该颜色的主对角线和副对角线的条数的较小值;但是对于某些情况,单种颜色的上界还需要在其基础上
n 和 m 均为偶数
单种颜色的上界为两种对角线条数的较小值即
n 和 m 均为奇数
分两种情况讨论:当
n 和 m 奇偶性不同
单种颜色的上界为
构造方法
不妨设
- 选择所有最左边一列能选的所有格子;
- 选择所有最右边一列能选的所有格子;
- 选择最中间的
1 行(n 为奇数)/2 行(n 为偶数)能选的所有格子,在这些格子中靠左的优先选择。
分类可知以上的构造都可以达到上界。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int h,w; bool f=false; cin>>h>>w;
if(h>w)f=true,swap(h,w);
vector<pair<int,int> > r;
set<int> p,m;
auto I=[&](int x,int y){
if(p.find(x+y)==p.end()&&m.find(x-y)==m.end())
p.emplace(x+y),m.emplace(x-y),r.emplace_back(x,y);
};
for(int i=0;i<h;i++)I(i,0);
for(int i=0;i<h;i++)I(i,w-1);
for(int i=0;i<w;i++)I(h-1>>1,i),I(h>>1,i);
cout<<r.size()<<endl;
if(f)for(auto &[x,y]:r)swap(x,y);
for(auto [x,y]:r)cout<<x+1<<' '<<y+1<<'\n';
return 0;
}