会正解做法之后还以为 10 10 答案是 ……
钦定 ,从 与 的匹配的角度考虑。考虑对于一对 ,我们保持 不变,, 如何变化。发现 。于是对于一个 ,符合条件的 , 为定值且 为一个区间。
再进一步,设 ,容易发现对于 , 不变,但是 变化。具体地 。则贪心地想,从小到大枚举 ,每个 都选择最小的满足条件的 (即选择能匹配的最小的 ),这样一定是不优的。开个数组对每个 记录当前已经选了的最大的 ,从前往后扫 ,从 开始判断是否可行。
由于 所以这个贪心是正确的。
code:
int n,m;
int b[12]={0,0,0,0,4,7,10,5,8,11,6,9};
void Yorushika(){
scanf("%d%d",&n,&m);
bool fl=0;
if(n<m){
swap(n,m);
fl=1;
}
vector<pii> ans;
rep(i,4,m*3+n){
int p=(i-4)%8+4;
int &j=b[p];
int x=((i+j)/4-(i-j)/2)/2,y=(i-x)/3;
while(x<1||y>m){
j+=8;
x=((i+j)/4-(i-j)/2)/2,y=(i-x)/3;
}
if(x<=n&&y>=1){
if(fl){
swap(x,y);
}
ans.eb(x,y);
}
j+=8;
}
printf("%d\n",ans.size());
for(auto [i,j]:ans){
printf("%d %d\n",i,j);
}
}
signed main(){
int t=1;
// scanf("%d",&t);
while(t--)
Yorushika();
}