每日一题 - 240412 - 完美队列的数目


  • TAG - 芝士水题、算法 − 【双指针、快速幂】 芝士水题、算法 - 【双指针、快速幂】 芝士水题、算法【双指针、快速幂】
  • 时间复杂度 - O ( N ∗ log ⁡ N ) O(N \ast \log N) O(NlogN)
//
#include <bits/stdc++.h>
using namespace std;
#define int long long 

const int MOD = 1e9 + 7;
const int N = 1e5 + 6;
int in[N];

int fp(int a, int n) {
    int ans = 1;
    while (n) {
        if (n & 1) ans = ans * a %MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return ans;
}

void solve() {
    int n, k;
    scanf("%lld%lld", &n, &k);
    for (int i = 1; i <= n; i++) scanf("%lld", &in[i]);

    sort(in + 1, in + n + 1);
    int i = 1, j = n, ans = 0;
    while (i <= j) {
        if (in[i] + in[j] <= k) {
            // 以 i 为起点、j 为终点的序列,有 2 ^ (j - i) 种方案
            // 其中 len = j - i + 1,起点 i 是固定的,所以二进制方案数要 -1
            ans = (ans + fp(2, j - i)) % MOD;
            i++;
        } else {
            j--;
        }
    }
    printf("%lld\n", ans);
}

signed main() {
    int t = 1;
    // scanf("%d", &t);
    while (t--) solve();
    return 0;
}

实现细节

  • `

参考示意图

  • `

参考链接

  • `

作者 | 乐意奥AI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值