牛客周赛 Round 92——E小红的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;
}

浙公网安备 33010602011771号