• 牛客月赛55 至至子的长链剖分


    链接:登录—专业IT笔试面试备考平台_牛客网
    来源:牛客网
     

    题目描述

    对于 nnn 个节点有根树(点的编号从 111 到 nnn),我们设节点 uuu 的“长链长度”为 huh_uhu​,其可以通过如下方式计算:

    hu={0if u is a leaf nodemax⁡v∈son⁡(u){hv}+1otherwiseh_u =

    {0if u is a leaf nodemaxvson(u){hv}+1otherwise" role="presentation">{0if u is a leaf nodemaxvson(u){hv}+1otherwise
    hu​=⎩⎨⎧​0v∈son(u)max​{hv​}+1​if u is a leaf nodeotherwise​

    即对于叶子节点,其 hhh 值为 000,否则为所有儿子节点中最大的 hhh 值 +1+1+1。
     

    现给定一棵树的 h1,h2,⋯ ,hnh_1,h_2,\cdots, h_nh1​,h2​,⋯,hn​,请还原该树的形态,或报告无解。如有多棵满足限制的树,输出任意一棵即可,详见输出格式。

    其中,叶子节点指没有子节点的节点,son(u)\mathrm{son}(u)son(u) 表示 uuu 节点的儿子节点构成的集合。

    输入描述:

    本题一个测试点内包含多组数据。
    
    第一行一个正整数 TTT,表示数据组数,1≤T≤100001\le T\le 100001≤T≤10000。
    
    每组数据的第一行包含一个正整数 nnn,表示树的节点数,保证 1≤n≤2×1051\le n\le 2\times 10^51≤n≤2×105 且 ∑n≤3×105\sum n\le 3\times 10^5∑n≤3×105。
    
    接下来一行 nnn 个整数 h1,h2,⋯ ,hnh_1, h_2,\cdots, h_nh1​,h2​,⋯,hn​,意义如上所述,保证 0≤hi 
     

    输出描述:

    对于每组数据,按照如下格式输出:
    
    如果无解,输出一行一个整数 −1-1−1 即可。
    
    否则先在第一行输出根节点的编号 rrr。接下来输出 n−1n-1n−1 行,每行两个正整数 u,vu,vu,v,表示你构造的树内有连边 (u,v)(u,v)(u,v)。请保证你输出的是一棵树。

    示例1

    输入

    复制3 5 2 3 1 0 0 6 1 1 0 0 0 0 2 1 0

    3
    5
    2 3 1 0 0 
    6
    1 1 0 0 0 0 
    2
    1 0

    输出

    复制2 2 1 1 3 3 5 2 4 -1 1 1 2

    2
    2 1
    1 3
    3 5
    2 4
    -1
    1
    1 2

    说明

     
     

    对于第一组数据,有下面几种(未列出全部)合法的方案:

    第二组数据无解,故输出 −1-1−1。

    第三组数据只有一组解,树根为 111 且只有一条边 (1,2)(1,2)(1,2)。

    1. #include <bits/stdc++.h>
    2. #pragma GCC optimize(2)
    3. using namespace std;
    4. typedef long long ll;
    5. #define endl '\n'
    6. inline ll read()
    7. {
    8. ll x = 0, f = 1;
    9. char ch = getchar();
    10. while (ch < '0' || ch > '9')
    11. {
    12. if (ch == '-')
    13. f = -1;
    14. ch = getchar();
    15. }
    16. while (ch >= '0' && ch <= '9')
    17. {
    18. x = (x << 1) + (x << 3) + (ch ^ 48);
    19. ch = getchar();
    20. }
    21. return x * f;
    22. }
    23. ll n, m, t, a, b, c, d, i, j, N = 1e5 + 2;
    24. vector<vector<ll>>A;
    25. int main()
    26. {
    27. ios::sync_with_stdio(0);
    28. cin.tie(0);
    29. cout.tie(0);
    30. A.resize(N << 1);
    31. for (t = read(); t; --t)
    32. {
    33. d = -1;
    34. for (n = read(), i = 1; i <= n; ++i)c = read(), A[c].push_back(i), d = max(c, d);
    35. a = d;
    36. if (A[d].size() > 1)d = -1;
    37. else for (i = 0; i < d; ++i)if (A[i].size() < A[i + 1].size()) d = -1;
    38. if (d == -1) cout << -1 << endl;
    39. else
    40. {
    41. // cout << A[a].back() << endl;
    42. for (i = a - 1; i != -1; --i)
    43. {
    44. for (j = 0; j < A[i].size(); ++j)
    45. {
    46. cout<<A[i].size()<<endl;
    47. cout << A[i + 1][min(j, ll(A[i + 1].size() - 1))] << ' ' << A[i][j] << endl;
    48. }
    49. }
    50. }
    51. for (i = 0; i <= a; ++i)A[i].clear();
    52. }
    53. return 0;
    54. }

     

  • 相关阅读:
    Discourse 如何在 header 上添加 HTML
    Python在WRF模型自动化运行及前后处理中的应用
    答网友提问 - SAP Business Technology Platform(BTP) 的计费模式
    【玩玩Vue】使用elementui页面布局和控制页面的滚动
    如何快速下载mysql的不同版本并启动mysql服务?
    密码学算法教程
    如何优化负载均衡?一文讲懂
    关于python中的装饰器(Decorator)的讲解
    IDEA工具之debug第三方jar包源码顺序错乱
    程序员常用的25个技术网站,良心推荐!
  • 原文地址:https://blog.csdn.net/m0_61949623/article/details/126438047