Skip to content

480B

Tutorial

Function "find" in STL set and map can be used to find a element in them in O(logN). It made them can be used as a hashtable whose query complexity is O(logN) instead of O(1).

Solution

#include <cstdio>
#include <algorithm>
using namespace std;

#define MAX_N 100005

int n, mark_len, girl, boy;
int mark[MAX_N];

void input()
{
    scanf("%d%d%d%d", &n, &mark_len, &girl, &boy);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &mark[i]);
    }
}

bool find(int a)
{
    int* p = lower_bound(mark, mark + n, a);
    if (p == mark + n)
        return false;
    return a == *p;
}

void work()
{
    bool found_boy = false;
    bool found_girl = false;
    for (int i = 0; i < n; i++)
    {
        found_boy = found_boy || find(mark[i] + boy);
        found_girl = found_girl || find(mark[i] + girl);
    }
    if (found_boy && found_girl)
    {
        puts("0");
        return;
    }
    if (found_boy)
    {
        puts("1");
        printf("%d\n", girl);
        return;
    }
    if (found_girl)
    {
        puts("1");
        printf("%d\n", boy);
        return;
    }
    for (int i = 0; i < n; i++)
    {
        if ((find(mark[i] + girl - boy) && mark[i] + girl <= mark_len) || find(mark[i] + girl + boy))
        {
            printf("1\n%d\n", mark[i] + girl);
            return;
        }
        if (find(mark[i] - girl + boy) && mark[i] - girl >= 0)
        {
            printf("1\n%d\n", mark[i] - girl);
            return;
        }
    }
    printf("2\n%d %d\n", girl, boy);
}

int main()
{
    input();
    work();
    return 0;
}