Codeforces #274 (Div. 2) (数据结构:set乱搞)

给出一组数,再给出x, y

判断在当前数组中至少需要插入几个数满足x,y出现在某两个数的差值中

我刚开始的想法是x,y依次加数组中的数,放入数组来找重复,想法没错,但是太难搞了

后来听说用set搞就行。。。很久没用set,都忘了怎么用了尴尬

后来看了下别人的代码,发现这个题还是很容易的

因为有0的存在,首先考虑set中已经出现x,y的情况

接着我们假设插入一个数和另外两个数的差值关系满足条件,那么这个数可以放在这两个数的左边、中间、右边

对应三中情况

最后就是需要插入两个数的情况

注意考虑边界情况,以及数据大小

代码如下:

#include <bits/stdc++.h>
#define LL long long
#define MAXN 300010
using namespace std;

LL a[MAXN];
set<LL> q;

int main(void) {
    int n, l, x, y, ansx, ansy;
    scanf("%d%d%d%d", &n, &l, &x, &y);
    for(int i=1; i<=n; ++i) {
        cin >> a[i];
        q.insert(a[i]);
    }

    ansx = ansy = -1;

    for(int i=1; i<=n; ++i) {
        if(q.count(a[i]-x)) ansx = i;
        if(q.count(a[i]-y)) ansy = i;
    }
    if(ansx!=-1 && ansy!=-1) {
        puts("0");
        return 0;
    }
    if(ansx != -1) {
        printf("1\n%d\n", y);
        return 0;
    }
    if(ansy != -1) {
        printf("1\n%d\n", x);
        return 0;
    }

    for(int i=1; i<=n; ++i) {
        if(q.count(a[i]-x-y) && i>=2) {
            puts("1");
            cout << a[i]-x << endl;
            return 0;
        }
        if(q.count(a[i]+x-y) && a[i]+x<=l && i<n) {
            puts("1");
            cout << a[i]+x << endl;
            return 0;
        }
        if(q.count(a[i]-y+x) && a[i]-y>=0 && i>=2) {
            puts("1");
            cout << a[i]-y << endl;
            return 0;
        }
    }
    printf("2\n%d %d\n", x, y);

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值