cf div2 977B(数论(同余)+上界的判断)

B题意:
长为n 的数组,可以对数值中任意的一个元素 进行 任意次的+x 的操作。
问数组可能的最大的mex 是什么?
n 的范围是 2e5 ,x的范围1e9
元素的范围是1e9

1.因为n 的范围是2e5,所以最大的mex就是n 、这样的数据范围就可以开桶了,(这个很快就意识到了)

2.对于a+K*x =b 这个式子,满足 a b 关于x同余。(当时做的时候,卡在了这一个点上)

这个上界的判断挺重要的,尤其在时间复杂度里面,可以让一些看似超时的算法,通过一些的条件的约束,变得可行
思路:
遍历 a 的数值桶,同时维护a关于x余数的数值桶。(因为有效的a的范围是2e5 所以关于 x余数的数组最多开到 2e5).

void solve()
{
    int n,x;
    cin>>n>>x;
    vector<int>a(n+1);
    for (int i=0,t;i<n;i++)
    {
        cin>>t;
        if (t>n)continue;
        a[t]++;
    }
    vector<int>b(min(x,n));
    int ans=0;
    for (int i=0;i<n;i++)
    {
        if (i==ans&&a[i])
        {
            ans++;
            a[i]--;
        }
        else {
            if (b[ans%x])
            {
                b[ans%x]--;
                ans++;   
            }
            else break;
        }
        if (a[i])
        {
            b[i%x]+=a[i];
            a[i]=0;
        }

    }
    cout<<ans<<"\n";
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值