题目背景

从前森林里有一棵很大的mjt树,树上有很多小动物。

题目描述

mjt树上有 n 个房间,第 i 个房间住着 ai 只第bi 种小动物。

这n个房间用n-1条路连接起来,其中房间1位mjt树的根。

现在每个房间x的小动物想知道,以房间x为根的mjt树中有多少只它们的同类.

输入输出格式

输入格式:

第一行一个整数n,表示房间数

接下来n行,每行两个整数ai,bi

再之后n-1,每行两个整数x、y,表示x和y之间有一条路径

输出格式:

一行n个数,第i个数表示以房间i为根的mjt树中bi种小动物有多少只,两个数之间用空格隔开

输入输出样例

输入样例#1: 复制

  1. 5
  2. 2 1
  3. 3 1
  4. 4 2
  5. 5 1
  6. 6 2
  7. 1 2
  8. 1 3
  9. 3 4
  10. 3 5
输出样例#1: 复制

  1. 10 3 10 5 6

说明

bi<=n<=100000,ai<=1000

by xjjppm.

我也不知道我是怎么想出来的这么鬼畜的做法

对于每个颜色记录出该颜色上一次出现的位置

然后拓扑排序。。

各位都是一遍dfs 太强了orz。

  1. // luogu-judger-enable-o2
  2. // luogu-judger-enable-o2
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<vector>
  6. #include<queue>
  7. #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
  8. char buf[ << ], *p1 = buf, *p2 = buf;
  9. //#define int long long
  10. using namespace std;
  11. const int MAXN = * 1e5 + ;
  12. inline int read() {
  13. char c = getchar(); int x = , f = ;
  14. while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
  15. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  16. return x * f;
  17. }
  18. struct Edge {
  19. int u, v, nxt;
  20. }E[MAXN];
  21. int head[MAXN], num = ;
  22. inline void AddEdge(int x, int y) {
  23. E[num] = (Edge){x, y, head[x]};
  24. head[x] = num++;
  25. }
  26. int N, a[MAXN], b[MAXN], ans[MAXN], inder[MAXN], pre[MAXN];
  27. vector<int>v[MAXN];
  28. void dfs(int x, int fa) {
  29. for(int i = head[x]; i != -; i = E[i].nxt) {
  30. if(E[i].v == fa) continue;
  31. if(pre[b[E[i].v]])
  32. v[E[i].v].push_back(pre[b[E[i].v]]), inder[pre[b[E[i].v]]]++;
  33. int gg = pre[b[E[i].v]];
  34. pre[b[E[i].v]] = E[i].v;
  35. dfs(E[i].v, x);
  36. pre[b[E[i].v]] = gg;
  37. }
  38.  
  39. }
  40. void Topsort() {
  41. queue<int>q;
  42. for(int i = ; i <= N; i++)
  43. if(!inder[i]) q.push(i);
  44. while(q.size() != ) {
  45. int p = q.front(); q.pop();
  46. for(int i = ; i < v[p].size(); i++) {
  47. a[v[p][i]] += a[p];
  48. inder[v[p][i]]--;
  49. if(!inder[v[p][i]]) q.push(v[p][i]);
  50. }
  51. }
  52. }
  53. main() {
  54. #ifdef WIN32
  55. freopen("a.in", "r", stdin);
  56. #endif
  57. memset(head, -, sizeof(head));
  58. N = read();
  59. for(int i = ; i <= N; i++) a[i] = read(), b[i] = read();
  60. for(int i = ; i <= N - ; i++) {
  61. int x = read(), y = read();
  62. AddEdge(x, y); AddEdge(y, x);
  63. }
  64. pre[b[]] = ;
  65. dfs(, );
  66. Topsort();
  67. for(int i = ; i <= N; i++)
  68. printf("%lld ", a[i]);
  69. return ;
  70. }

校内胡策 T9270 mjt树的更多相关文章

  1. T9270 mjt树

    题目背景 从前森林里有一棵很大的mjt树,树上有很多小动物. 题目描述 mjt树上有 n 个房间,第 i 个房间住着 ai 只第bi 种小动物. 这n个房间用n-1条路连接起来,其中房间1位mjt树的 ...

  2. 弱省胡策 Magic

    弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...

  3. 【弱省胡策】Round #5 Count

    [弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...

  4. 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)

    DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...

  5. luoguP3769 [CH弱省胡策R2]TATT

    luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...

  6. 【弱省胡策】Round #7 Rectangle 解题报告

    orz PoPoQQQ 的神题. 我的想法是:给每一个高度都维护一个 $01$ 序列,大概就是维护一个 $Map[i][j]$ 的矩阵,然后 $Map[i][j]$ 表示第 $i$ 根柱子的高度是否 ...

  7. STOI补番队胡策

    ROUND 1 第一轮是我出的. 比赛情况: #1 NanoApe 300 (完美AK) #2 && #3 swm_sxt / ccz  200 A.candy 这道题就是个nim游戏 ...

  8. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

  9. 城乡联谊胡策会糊厕R3

    因为时间关系这把没设计题面,而且居然还出了锅……T_T 信 原题是leetcode WeeklyContest52 的T1(懒得去找url了 随便搞,但是无解输-1 数字统计 原题PE603 记前n个 ...

随机推荐

  1. LeetCode赛题395----Longest Substring with At Least K Repeating Characters

    395. Longest Substring with At least K Repeating Characters Find the length of the longest substring ...

  2. C#-MDI-多窗口通信方法总结

    总结C#中窗体间传递数据的几种方法 (由别人的方法整理) 转自:http://blog.csdn.net/daisy423xu/article/details/1579854 在编写C#windows ...

  3. C/C++内存管理详解 ZZ

    内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的 检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存 ...

  4. CSS制作图形速查表

    很少会有人意识到,当浏览器绘制的border,会有一个角度的问题.我们就是得用这样的一个技巧来制作三角的效果.我们只需要保证一边的边框是有色,其他边框色为透明色,这样我们就很容易制作出三角形,然后改变 ...

  5. lambdas vs. method groups

    Update: Due to a glitch in my code I miscalculated the difference. It has been updated. See full his ...

  6. redis连接被拒绝

    1,服务未启动: 执行:lsof -i :6379 isof-i命令查看是否开启进程 结果如下,证明开启 COMMAND     PID USER   FD   TYPE DEVICE SIZE/OF ...

  7. 本地缓存和redis

    项目中的传统架构在服务启动时 读取数据库的大部分数据到本地内存,在看到redis的作用时发出疑问,到底有什么样的区别以及怎么选择呢,下面是别人的回答 使用本地缓存快还是使用redis缓存好? Redi ...

  8. 浅谈 JavaScript 中的继承模式

    最近在读一本设计模式的书,书中的开头部分就讲了一下 JavaScript 中的继承,阅读之后写下了这篇博客作为笔记.毕竟好记性不如烂笔头. JavaScript 是一门面向对象的语言,但是 ES6 之 ...

  9. JavaScript设计模式导学

    如何成为一名合格的工程师? 作为一名合格的工程师,不仅需要懂代码,还要懂设计,一名合格工程师的必备条件: 前端开发有一定的设计能力,一般三年开发经验的同学,面试必须考设计能力 成为项目技术负责人,设计 ...

  10. Mac Sublime Text 3

    安装Package Control安装过程: 使用快捷键 control + ` 或者菜单栏选择View > Show Console安装Package Control参考官方页面.Sublim ...