首页 > 其他分享 >【2023.05.07 模拟赛】T3 树数树

【2023.05.07 模拟赛】T3 树数树

时间:2023-05-11 19:44:28浏览次数:41  
标签:head include int T3 tot 2023.05 next 树数树 mathrm

Description

牛牛有一棵 \(n\) 个点的有根树, 根为 1 。

我们称一个长度为 \(m\) 的序列 \(a\) 是好的,当且仅当:

  • \(\forall i \in(1, m], \mathrm{a}_{\mathrm{i}}\) 为 \(\mathrm{a}_{\mathrm{i}-1}\) 的祖先或 \(\mathrm{a}_{\mathrm{i}-1}\) 是 \(\mathrm{a}_{\mathrm{i}}\) 的祖先;
  • \(\forall 1 \leq i<j \leq m, a_i \neq a_j\) 。

你需要帮助牛牛求出最长的序列长度。

Solution

对于节点 \(x\),它能够将两条子树内的序列连接起来。既然这样,不妨考虑对于每个节点,构建一个堆,来记录该子树内的所有可能的序列长度。那么在合并两个儿子的时候,可以用可并堆或者启发式合并来实现。时间复杂度 \(\mathcal O(n\log n) \sim \mathcal O(n\log ^2n)\)。

Code

#include<queue>
#include<cstdio>
#include<algorithm>
#define N 100005
using namespace std;
int T,n,tot,id[N];
struct node {int to,next,head;}a[N<<1];
priority_queue<int> q[N];
void add(int x,int y)
{
    a[++tot].to=y;a[tot].next=a[x].head;a[x].head=tot;
    a[++tot].to=x;a[tot].next=a[y].head;a[y].head=tot;
}
void merge(int &x,int &y)
{
    if (q[x].size()<q[y].size()) swap(x,y);
    while (!q[y].empty()) q[x].push(q[y].top()),q[y].pop();
}
void dfs(int x,int fa)
{
    for (int i=a[x].head;i;i=a[i].next)
    {
        int y=a[i].to;
        if (y==fa) continue;
        dfs(y,x);
        merge(id[x],id[y]);
    }
    x=id[x];
    if (q[x].empty()) q[x].push(1);
    else
    {
        if (q[x].size()==1)
        {
            int v=q[x].top();q[x].pop();
            q[x].push(v+1);
        }
        else
        {
            int v1=q[x].top();q[x].pop();
            int v2=q[x].top();q[x].pop();
            q[x].push(v1+v2+1);
        }
    }
}
int main()
{
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&n);
        for (int i=1;i<=n;++i)
            id[i]=i;
        for (int i=1;i<n;++i)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            add(x,y);
        }
        dfs(1,0);
        printf("%d\n",q[id[1]].top());
        tot=0;
        for (int i=1;i<=n;++i)
            a[i].head=0;
        while (!q[id[1]].empty()) q[id[1]].pop();
    }
    return 0;
}

标签:head,include,int,T3,tot,2023.05,next,树数树,mathrm
From: https://www.cnblogs.com/Livingston/p/17392029.html

相关文章

  • Nuxt3.0中使用EChart可视化图表
    ......
  • 【2023.05.09】厦门无线电A证考试体验(无线电台执照)
    考这个证书主要是上班事情不多,所以业余时间学了一下无线电三月份去厦门无线电管理局考试,三天前接到无管局接到电话今天才刚拿到证,也就是说考完可能要等一个月半才能拿到证书进去无管局,会先在会议室抽号码排队,会议室收拾得很干净,奖牌也很多因为我和同学一起去,所以我们是连号......
  • 【2023.05.08】keepley周杰伦DZ0155周同学积木评测
    前言本人是自费购买积木,购买原因是给妹妹培养动手能力,减少短视频占用时间,其次是给家里做摆饰,所以选择积木多考虑了美观非专业评测,如果想看更多积木评测请点进我的博客主页分类查看正文原本这个积木是粉色的,改成黑色替换件的话比较麻烦,简便的方法是将原包装内的粉色挑出来(因......
  • 【2023.05.07】再见,福州大学
    五一回了一趟学校,想见见学弟,以及收拾一下宿舍第一天晚上九点多差不多到学校,到学校的第一件事就是去和学弟吃烧烤嘛,两年没见的学弟了,之前他因为个人原因所以休学了一年,现在看到他现在好多了,我很开心还见到了吧主和一些学弟网友,很开心网上大家都自称鼠鼠,没想到线下都是帅哥,交流......
  • 记一次Nuxt3更改生成的_nuxt文件夹名称的坑
    目的:修改静态生成文件夹名称:_nuxt=>static改这个的原因是部署到GithubPage的时候_nuxt里面的js/css文件提示404,查了一下是因为Github的contentpolicy不允许这类文件的加载。buildAssetsDir应该包裹在app里面,而不是直接将这个值放在config的对象里面而且这是Nuxt3-genera......
  • CWOI 2023.05.04 题解
    mzx的动态规划杂题选讲。stoARC153D-SumofSumofDigitsP7152[USACO20DEC]BovineGeneticsGCF1542E2AbnormalPermutationPairs(hardversion)题意给定\(n,m\),求有多少对长度为\(n\)的排列\(p,q\),满足以下条件:\(p\)的字典序小于\(q\);\(p\)的逆序对......
  • SPOJ COT3 Combat on a tree
    简要题意给定一棵有根树,初始有黑点白点。两人交替操作,每次选择一个白点,将这个点到根路径上所有点染黑,选不了则输。求先手能否必胜;如果能,给出第一步可能的所有走法。数据范围:\(1\len\le10^5\)。题解小清新题。难度不配黑题。进行一次操作以后,这个点到根路径上所有点两侧的子......
  • 【2023.05.04】幸运的猫(下)
    本次博客主要写黑猫回家后的故事未到家前我打电话和我父亲开玩笑说要带女朋友回家过年我爹还蛮激动的,问是哪里的女孩子,我说是福州的忘记了带回家后他是什么心情了哈哈果然还是要多写日记啊,不然什么都忘记了可太糟糕了初到家中初到家里的时候是还关在笼子里的,因为想把猫养......
  • STAT3010统计方法
    STAT3010/6075StatisticalMethodsinInsuranceAssignment2 Thisassignmentisworth10%oftheoverallmarkforSTAT3010/6075. Thedeadlineforsubmissionis16.00onThursday4May2023. StandardUniversitypoliciesandprocedureswillbefollowedforla......
  • 击败GPT3,刷新50个SOTA!谷歌全面统一NLP范式
    文|ZenMoore编|小轶写在前面一觉醒来,迷糊之中看到一条推特:瞬间清醒!Google的YiTay(andMostafa)团队提出了一个新的策略Mixture-of-Denoisers,统一了各大预训练范式。重新思考现在的预训练精调,我们有各种各样的预训练范式:decoder-onlyorencoder-decoder,spancorrupti......