2022-10-28-ht数据库笔试-110min

禁止任何人未经发件人许可以任何形式(包括但不限于部分地泄露、复制或散发)不当地使用本邮件中的信息

3个笔试题,word文件,72小时回复邮件即可,无监考。

// #include <iostream>
// #include <vector>
// #include <stack>
// int main()
// {
//     std::vector<double> v = {13.5, 13.6, 13.4, 13.3, 13.5, 13.9, 13.1, 20.1, 20.2, 20.3};
//     uint32_t n = v.size();
//     std::vector<uint32_t> maxArrLen(n);
//     std::stack<uint32_t> st;
//     for (uint32_t i = 0; i < n; i++)
//     {
//         while (!st.empty() && v[st.top()] <= v[i])
//             st.pop();
//         maxArrLen[i] = st.empty() ? i + 1 : i - st.top();
//         st.push(i);
//     }
//     for (uint32_t i = 0; i < n; i++)
//         std::cout << maxArrLen[i] << " ";
//     return 0;
// }

// #include <iostream>
// #include <cmath>

// int main()
// {
//     unsigned long long M1, M2, m1, m2, t = 0, n;
//     std::cin >> M1 >> M2;
//     m1 = M1;
//     m2 = M2;

//     if (m2 > m1)
//     {
//         unsigned long long out = m2 - m1; // n(1+n)=2out
//         n = (unsigned long long)(std::sqrt(1 + 8 * out) - 1) / 2;
//         unsigned long long c = (1 + n) * n / 2;
//         m2 = m2 - c;
//         t = n + 1;
//         if (c < out && m2 >= n + 1)
//         {
//             m2 = m2 - (n + 1);
//             t++;
//         }
//     }
//     else
//     {
//         unsigned long long out = m1 - m2;
//         n = (unsigned long long)(std::sqrt(1 + 8 * out) - 1) / 2;
//         unsigned long long c = (1 + n) * n / 2;
//         m1 = m1 - c;
//         t = n + 1;
//     }

//     // 接下来轮流地
//     // 从m1上申请t、t+2、t+4...t+2n个字节, t(n+1)+(2+2n)n/2=tn+t+n(1+n)=n*n+(t+1)n+t-m1<=0
//     // 从m2上申请t+1、t+3、t+5...、t+2n-1或t+2n+1个字节
//     if (m1 >= t)
//     {
//         n = (std::sqrt((t + 1) * (t + 1) + 2 * t + 1 + 4 * m1 - 4 * t) - t - 1) / 2;
//         m1 = m1 - (n * n + (t + 1) * n + t);
//         m2 = m2 - (n * n + (t + 1) * n + t + n + 1 - (t + 2 * n + 1)); // Bug:m2是无符号数,不能提前多减一个数再判断是否小于0再加上多减去的数
//         if (m2 >= t + 2 * n + 1)
//         {
//             m2 -= t + 2 * n + 1;
//             t += 2 * n + 2;
//         }
//         else
//             t += 2 * n + 1;
//     }
//     std::cout << "Answer: " << t << ", " << m1 << ", " << m2 << "\n";

//     // 验证程序
//     m1 = M1, m2 = M2, t = 0;
//     while (true)
//     {
//         if (m1 >= t && m2 >= t)
//         {
//             if (m1 < m2)
//                 m2 -= t;
//             else
//                 m1 -= t;
//         }
//         else if (m1 >= t)
//             m1 -= t;
//         else if (m2 >= t)
//             m2 -= t;
//         else
//             break;
//         t++;
//     }
//     std::cout << "GroundTruth: " << t << ", " << m1 << ", " << m2 << "\n";
//     return 0;
// }
// // 1000000000000000000 99999999999999999
// // Answer: 1483239697, 646162599, 717131344
// // GroundTruth: 1483239697, 646162599, 717131344

// // 只有一些if判断、加减乘除和开根号,时间复杂度可以看成O(1),如果按二进制位数来算时间复杂度是O(log(m1+m2))。

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

inline int lowBit(int x)
{
    return x & -x;
}

int main()
{
    std::vector<int32_t> v = {1, 3, 2, 3, 4};
    uint32_t n = v.size();
    std::vector<int32_t> r(n), a = v, t = v;

    // 离散化
    std::sort(t.begin(), t.end());
    for (int &num : a)
    {
        num = std::lower_bound(t.begin(), t.end(), num) - t.begin() + 1;
    }
    std::vector<int32_t> tree(n + 1, 0);
    for (uint32_t i = 0; i < n; i++)
    {
        int32_t q = a[i];
        q -= 1; // 不包括本身
        while (q)
        {
            r[i] += tree[q];
            q -= lowBit(q);
        }
        q = a[i];
        while (q < tree.size())
        {
            tree[q] += 1;
            q += lowBit(q);
        }
    }
    for (auto &i : r)
        std::cout << i << " ";
    return 0;
}
#23届秋招笔面经##笔试##23秋招##秋招##数据库#
全部评论

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务