牛客周赛 Round 92——E小红的ds题

题目

小红的ds题

题解

这其实是一道模拟题,就是要有点代码功底,当我们在当前层的时候,记录当前层的点是否有儿子及它的id值,能放两个儿子就放两个,其次是一个,最后是没有儿子,这里a初始化大小为n + 2是因为最后一层k赋值为0的原因。

参考代码

#include <iostream>
#include <vector>
using namespace std;
#define int long long
typedef pair<int, int> PII;
signed main() {
    int n;
    cin >> n;
    vector<int> a(n + 2, 0);
    for (int i = 1; i <= n; i++) cin >> a[i];
    vector<int> s(n + 1, 0);
    for (int i = 1; i <= n; i++) {
        s[i] = s[i - 1] + a[i];
    }
    
    vector<PII> children(s[n] + 1, {-1, -1});
    for (int l = 1; l <= n; l++) {
        int m = a[l];    // 当前层个数
        int k = a[l + 1];    // 下一层个数
        int sc = s[l] + 1; // 下一层初始id
        
        int t = sc;
        int sp = s[l - 1] + 1; // 当前层初始id
//         cout << "m---" << m << "     " << "k---" << k << endl;
        for (int p = 0; p < m; p++) {
            int id = sp + p;
            if (k >= 2) {
                children[id].first = t++;
                children[id].second = t++;
                k -= 2;
            } else if(k >= 1){
                children[id].first = t++;
                k -= 1;
            } else break;
        }
    }
    
    cout << 1 << "\n";
    for (int i = 1; i <= s[n]; i++) {
        cout << children[i].first << " " << children[i].second << endl;
    }
    return 0;
}
posted @ 2025-05-12 16:31  PZnwbh  阅读(11)  评论(0)    收藏  举报