题解:B4225 [常州市程序设计小能手 2024] 黑板

· · 题解

很有意思也很麻烦的一道构造题。

为方便讨论,将起始值 abx 中扣除,得到一个 0\sim b 的序列。显然当 x=0x=b 极端值时由于一定存在极端值以内的值,无法达到。

注意到以下构造方法:

同理可以从大到小构建生成的数字不断减少的方法。它可以消除一串数,得到的结果和未消除的串相隔一个空位。接下来分类讨论:

因此我们可以得到复杂度为 O(b-a) 的构造方法。注意题目中的“小号储存平均值,大号消失”的规则,需要小心变换数和位置的关系,这里的方法请你自行构建,盯着他人的思路容易互相绕晕。

Python 代码

a,b,x=map(int,input().split());x-=a;b-=a
if(b-x)*x:
    if x==1:
        print(b-2,b)
        for a in range(b-1):print(b-2-a,b-1-a)
    elif x==b-1:
        print(0,2);print(0,1)
        for a in range(b-2):print(0,a+3)
    elif x==2:
        print(0,b-b%2);print(b-3+b%2,b-1+b%2)
        for a in range(b-b//2-1):print(b-3-a,b-2-a)
        print(0,b//2-1)
        for a in range(b//2-2):print(0,b//2-2-a)
    elif x==b-2:
        print(b%2,b);print(1-b%2,3-b%2);print(1-b%2,2+b%2)
        for a in range(b-b//2-2):print(1-b%2,a+4)
        print(0,1)
        for a in range(b//2-2):print(0,b//2+b%2+2+a)
    else:
        print(0,2);print(0,1);print(b-2,b)
        for a in range(x-3):print(0,a+3)
        for a in range(b-x-2):print(b-2-a,b-1-a)
        print(0,x+1);print(0,x)
else:print(-1)

C/C++ 代码

#include<stdio.h>
int a,b,x;
int main()
{
    scanf("%d%d%d",&a,&b,&x);
    b-=a;
    x-=a;
    if((b-x)*x)
    {
        if(x==1)
        {
            printf("%d %d\n",b-2,b);
            for(a=0;a<b-1;++a)
            {
                printf("%d %d\n",b-2-a,b-1-a);
            }
        }
        else if(x==b-1)
        {
            printf("%d %d\n",0,2);
            printf("%d %d\n",0,1);
            for(a=0;a<b-2;++a)
            {
                printf("%d %d\n",0,a+3);
            }
        }
        else if(x==2)
        {
            printf("%d %d\n",0,b-b%2);
            printf("%d %d\n",b-3+b%2,b-1+b%2);
            for(a=0;a<b-b/2-1;++a)
            {
                printf("%d %d\n",b-3-a,b-2-a);
            }
            printf("%d %d\n",0,b/2-1);
            for(a=0;a<b/2-2;++a)
            {
                printf("%d %d\n",0,b/2-2-a);
            }
        }
        else if(x==b-2)
        {
            printf("%d %d\n",b%2,b);
            printf("%d %d\n",1-b%2,3-b%2);
            printf("%d %d\n",1-b%2,2+b%2);
            for(a=0;a<b-b/2-2;++a)
            {
                printf("%d %d\n",1-b%2,a+4);
            }
            printf("%d %d\n",0,1);
            for(a=0;a<b/2-2;++a)
            {
                printf("%d %d\n",0,b/2+b%2+2+a);
            }
        }
        else
        {
            printf("%d %d\n",0,2);
            printf("%d %d\n",0,1);
            printf("%d %d\n",b-2,b);
            for(a=0;a<x-3;++a)
            {
                printf("%d %d\n",0,a+3);
            }
            for(a=0;a<b-x-2;++a)
            {
                printf("%d %d\n",b-2-a,b-1-a);
            }
            printf("%d %d\n",0,x+1);
            printf("%d %d\n",0,x);
        }
    }
    else
    {
        putchar(45);
        putchar(49);
    }
}