正题

题目链接:https://ac.nowcoder.com/acm/contest/20107/C


题目大意

给出nnn个点的一棵树,求一个最长的序列使得数字互不相同且相邻编号节点的都是祖孙关系。

1≤n≤105,1≤T≤51\leq n\leq 10^5,1\leq T\leq 51≤n≤105,1≤T≤5


解题思路

wx,iw_{x,i}wx,i​表示节点xxx第iii次下来最多能获得的代价(保证前面最优的情况),那么转移的时候我们之间把子节点的www从大到小排序然后因为节点xxx有一次额外机会向下,所以我们还要把前两个最大的www给合并。

这个过程用启发式合并+堆就好了,时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e5+10;
struct node{int to,next;
}a[N<<1];
int T,n,tot,ls[N],siz[N],son[N];
priority_queue<int> s[N],q;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x,int fa){siz[x]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;dfs(y,x);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}return;
}
void solve(int x,int fa,int top){for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa||y==son[x])continue;solve(y,x,y);}if(son[x])solve(son[x],x,top);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa||y==son[x])continue;while(!s[y].empty())q.push(s[y].top()),s[y].pop();}int w=0;if(!q.empty())w+=q.top(),q.pop();if(!q.empty())w+=q.top(),q.pop();q.push(w+1);if(x==top)while(!q.empty())s[x].push(q.top()),q.pop();return;
}
int main()
{scanf("%d",&T);while(T--){memset(ls,0,sizeof(ls));memset(son,0,sizeof(son));scanf("%d",&n);tot=0;for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}dfs(1,1);solve(1,1,1);printf("%d\n",s[1].top());while(!s[1].empty())s[1].pop();}return 0;
}

2021牛客OI赛前集训营-树数树【树上启发式合并,堆】相关推荐

  1. 2021牛客OI赛前集训营-提高组(第四场) T2空间跳跃

    2021牛客OI赛前集训营-提高组(第四场) 题目大意 给你三个整数 n , d , l n,d,l n,d,l, n n n为正整数.负整数或0, d , l d,l d,l为正整数,你现在有一个数 ...

  2. 2021牛客OI赛前集训营-提高组(第五场)D-牛牛的border【SAM】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/20110/D 题目大意 求一个长度为nnn的字符串的所有子串的borderborderborder长度和. 1 ...

  3. 2021牛客OI赛前集训营-提高组(第五场)C-第K排列【dp】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/20110/C 题目大意 一个长度为nnn的字符串SSS,SSS中存在一些???,有N/O/I/PN/O/I/P ...

  4. 2021牛客OI赛前集训营-交替【生成函数】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/20108/B 题目大意 给出一个长度为nnn的序列aaa,每次 如果nnn是偶数,则对于所有的i<ni& ...

  5. 2021牛客OI赛前集训营-方格计数【计数,dp】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/20107/B 题目大意 给出一个w×hw\times hw×h的网格图,然后要求在上面选出nnn个格点,使得它 ...

  6. 【2020牛客NOIP赛前集训营-提高组(第一场)题解】( 牛牛的方程式,牛牛的猜球游戏,牛牛的凑数游戏,牛牛的RPG游戏)

    未完待续... T1:牛牛的方程式 title solution code T2:牛牛的猜数游戏 title solution code T3:牛牛的凑数游戏 title solution code ...

  7. 2020牛客NOIP赛前集训营-普及组第三场C牛半仙的妹子树

    链接:https://ac.nowcoder.com/acm/contest/7608/C 来源:牛客网 牛半仙有 n​ 个妹子,她们所在的位置组成一棵树,相邻两个妹子的距离为 1​. 有 m​ 个妹 ...

  8. 2020牛客NOIP赛前集训营-提高组(第一场) T2 牛牛的猜球游戏

    题目链接: 牛客原站 通过记录: 题目链接2:T277380 牛牛的猜球游戏(被我们搬到洛谷力): 洛谷搬运 题目描述   有十个数 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ...

  9. 2020牛客NOIP赛前集训营-提高组(第三场)C-牛半仙的妹子Tree【虚树,最短路】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7609/C 题目大意 给出nnn个点的一棵树,mmm个时刻各有一个操作 标记一个点,每个点被标记后的每一个时刻 ...

最新文章

  1. 原来AGILE就是这么一回事啊!
  2. 重置表单验证 清除表单校验信息
  3. HTML5+CSS3构建同页面表单间的动画切换
  4. java date 转integer_java 中Date的各种格式转换
  5. 7-31总结----javascript
  6. Spring: ConfigurationClassUtils类
  7. node 多进程 vs java_如何理解node的多进程
  8. 捷联惯导基础知识解析之二(捷联惯导更新算法和误差方程)
  9. 1024 科学计数法(C语言)测试点4详解
  10. 如何通过iTunes安装ipa测试包
  11. 2007年12月25日至2008年1月1日百宝箱游戏下载排行榜
  12. 微信公众号订阅消息 wx-open-subscribe 的实现及闭坑指南
  13. img标签图片404异常捕获返回默认图片
  14. 网站下载工具有哪些?
  15. Ubuntu 屏幕颜色校准
  16. python取反函数_编程语言取反函数
  17. 利用LORA无线信号接入数据的手持PDA装置
  18. 5.5 图层样式的复制和粘贴 [原创Ps教程]
  19. java unpack_参数,解包-UNpack
  20. 【JY】基于性能的抗震设计浅析(一)

热门文章

  1. 会计电算化的重要物质基础计算机和,湖北工业大学工程技术学院会计电算化管理办法...
  2. 微信 小程序 python 渲染_微信小程序渲染html内容
  3. 用python写简单爬虫,用Python写简单的爬虫
  4. navicat如何连接腾讯mysql_使用Navicat连接腾讯云Mysql数据库
  5. centos php.ini redis,CentOS下安装Redis及Redis的PHP扩展
  6. ofdm解调算法_OFDM系统中固定频偏算法
  7. python 日期格式校验_python – 如何验证时间格式?
  8. HTML阅读位置,script在HTML文档中位置
  9. c语言怎么让图形界面单独显示,「分享」C语言如何编写图形界面
  10. android http请求缓存,Android Http请求和响应使用协议缓冲区