爆零了,求帮助,悬赏一关注
查看原帖
爆零了,求帮助,悬赏一关注
1333723
kervinyan楼主2024/5/20 20:01
#include <iostream>
#include <vector>

using namespace std;

int main() {
    int N, Q;
    cin >> N;
    vector<int> lengths(N);
    for (int i = 0; i < N; ++i) {
        cin >> lengths[i];
    }
    cin >> Q;
    vector<int> queries(Q);
    for (int i = 0; i < Q; ++i) {
        cin >> queries[i];
    }

    // 模拟切割过程,但实际上并不改变数组
    for (int i = N - 1; i >= 0; --i) {
        while (lengths[i] % 2 == 0) {
            // 标记为已切割,但实际上不改变数组
            // 在实际查询时,我们需要考虑这个标记
            lengths[i] /= 2;
            // 如果这不是最右边的段,我们可以创建一个新的段在其右侧
            if (i < N - 1) {
                lengths.push_back(lengths[i]);
                N++; // 更新段数
            }
        }
    }

    // 回答查询
    for (int i = 0; i < Q; ++i) {
        int index = queries[i] - 1; // 索引从0开始
        // 如果该段或其任何右侧的段被切割过,我们需要加上这些额外的段
        while (index >= N - 1) {
            index -= N - 1; // 跳转到新创建的段的索引
            N--; // 更新段数,因为我们“移除”了最右边的段
        }
        cout << lengths[index] << endl;
    }

    return 0;
}

2024/5/20 20:01
加载中...