题目描述

中二少年$cenbo$幻想自己统治着$Euphoric\ Field$。由此他开始了$Endless\ Fantasy$。
$Euphoric\ Field$有$n$座城市,$m$个民族。这些城市之间由$n-1$条道路连接形成了以城市$1$为根的有根树。每个城市都是某一民族的聚居地,$cenbo$知道第$i$个城市的民族是$A_i$,人数是$B_i$。为了维护稳定,$cenbo$需要知道某个区域内人数最多的民族。他向你提出$n$个询问,其中第$i$个询问是:求以$i$为根的子树内,人数最多的民族有是哪个,这个民族有多少人。如果子树内人数最多的民族有多个,输出其中编号最小的民族。


输入格式

第一行有两个整数$n,m$。
接下来$n-1$行,每行有两个整数$u,v$,表示一条连接$u$和$v$的道路。
接下来$n$行,第$i$行有两个整数$A_i,B_i$。


输出格式

第i行两个整数$x,y$,分别表示以$i$为根的子树中人数最多的民族和它的人数。


样例

样例输入:

8 6
1 2
1 3
2 4
4 5
3 6
5 7
1 8
2 8
2 5
1 1
3 1
6 7
5 6
1 10
4 6

样例输出:

2 13
1 10
5 6
1 10
1 10
5 6
1 10
4 6


数据范围与提示

$30\%$的数据,$n\leqslant 4,000$;
$60\%$的数据,$n\leqslant 40,000$;
$100\%$的数据,$n\leqslant 400,000$,$m\leqslant n$,$1\leqslant A_i\leqslant m$,$0\leqslant B_i\leqslant 1,000$。
输入文件较大请使用读入优化。


题解

不得不否认,这道题的确可以用线段树合并$A$掉。

但是我又没有打正解。

但是仔细观察,它是没有修改操作的,所以我们可以考虑另一种方法,先求出重儿子,然后暴力统计答案,理论上会被卡死。

时间复杂度:$\Theta($玄学$)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec{int nxt,to;}e[1000000];
int head[400001],cnt;
int n,m;
int a[400001],b[400001];
bool vis[400001];
int son[400001],size[400001];
int v[400001];
long long sum[400001];
pair<int,long long> ans[400001];
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void connect(int x)
{
if(v[a[x]]!=sum[0])
{
v[a[x]]=sum[0];
sum[a[x]]=b[x];
}
else sum[a[x]]+=b[x];
if(sum[a[x]]>b[0])
{
a[0]=a[x];
b[0]=sum[a[x]];
}
if(sum[a[x]]==b[0]&&a[x]<a[0])a[0]=a[x],b[0]=sum[a[x]];
}
void find(int x,int fa)
{
connect(x);
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa)find(e[i].to,x);
}
void pre_dfs(int x)
{
vis[x]=1;
size[x]=1;
for(int i=head[x];i;i=e[i].nxt)
if(!vis[e[i].to])
{
pre_dfs(e[i].to);
size[x]+=size[e[i].to];
if(size[e[i].to]>size[son[x]])son[x]=e[i].to;
}
}
void pro_dfs(int x,int fa)
{
if(!x)return;
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa&&son[x]!=e[i].to)
{
pro_dfs(e[i].to,x);
sum[0]++;
b[0]=-1;
}
pro_dfs(son[x],x);
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa&&son[x]!=e[i].to)
find(e[i].to,x);
connect(x);
ans[x]=make_pair(a[0],b[0]);
}
int main()
{
scanf("%d%d",&n,&m);
sum[0]=1;b[0]=-1;
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
pre_dfs(1);
pro_dfs(1,0);
for(int i=1;i<=n;i++)printf("%d %lld\n",ans[i].first,ans[i].second);
return 0;
}

rp++

[CSP-S模拟测试]:Endless Fantasy(DFS)的更多相关文章

  1. [CSP-S模拟测试]:虎(DFS+贪心)

    题目传送门(内部题15) 输入格式 第一行一个整数$n$,代表点数接下来$n-1$行,每行三个数$x,y,z$,代表点$i$与$x$之间有一条边,若$y$为$0$代表初始为白色,否则为黑色,若$z$为 ...

  2. [CSP-S模拟测试]:世界线(DFS+bitset)

    题目描述 时间并不是一条单一的线,而是有许多世界线构成的流. 在一些时刻,世界线会发生分裂:同样的,它们也有可能在一些时刻收束在一起.如果将这些时刻抽象成点,那么这些世界线构成的网络,实际上是一张有向 ...

  3. csp-s模拟47 Emotional Flutter,Endless Fantasy题解

    题面:https://www.cnblogs.com/Juve/articles/11558523.html A:Emotional Flutter 如果起点确定,那么我们后面走的点都是固定的,及mo ...

  4. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  5. [考试反思]1003csp-s模拟测试58:沉淀

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

  6. [CSP-S模拟测试47]反思+题解

    打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...

  7. 2019.9.19 csp-s模拟测试47 反思总结

    思路接近正解?都想到了?这都是借口呀. 没有用的,往前走吧. T1:Emotional Flutter 我的做法和题解不太一样,我把s放在最后考虑了. 因为出发以后步幅是一样的,所以每一个黑条可以ba ...

  8. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  9. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

随机推荐

  1. 生日蛋糕(dfs+剪枝)

    生日蛋糕 POJ - 1190 题目: 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.  设从下往上数第i(1 <= i <= M) ...

  2. git报错-Initial commit Untracked files nothing added to commit but untracked ……

    文章转自 https://www.jianshu.com/p/61c3db30d488 在目标执行命令 git stratus 报错 根据上面的文章,可以解决问题.不行的话,请留言. 感谢你的阅读

  3. CentOS 安装开发工具包

    这里使用组安装包,一次性安装所有开发者工具. 1.查看有那些组安装包可用. [root@bogon ~]# yum grouplist | more 2.搜索一下有哪些和 Development 有关 ...

  4. 解读vue filter

    1.全局filter, 全局的过滤一般在main.js里面使用 <div id="app"> <div> {{testVal | filVal(10,30) ...

  5. (Vue)移动端点击输入框,弹出键盘,底部被顶起问题

    (Vue)移动端点击输入框,弹出键盘,底部被顶起问题:https://www.jianshu.com/p/210fbc846544 问题描述:Vue开发中,当我们相对于父视图的底部布局子控件时,需要用 ...

  6. ES6---new Promise()讲解,Promise对象是用来干嘛的?

    ES6---new Promise()讲解,Promise对象是用来干嘛的? :https://blog.csdn.net/Wbiokr/article/details/79490390

  7. mysql 5.7 事务隔离级别

    事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repeatable read).串行化(serializable). 未提交读: ...

  8. 57-python基础-python3-集合-集合常用方法-添加元素-add()-update()

    添加元素-add()-update() 1-add() add()用于增加一个元素值,原值修改,无返回值. 2-update()用于添加一个可迭代的对象,原值修改,无返回值. 下面依次向集合添加可迭代 ...

  9. 【学习总结】cpu缓存

    参考链接: cpu缓存java性能问题初探 高速缓存 在内存与cpu寄存器之间,还有一块区域叫做cpu高速缓存,即我们常常说的cache. cache分为L1.L2.L3三级缓存,速度递减,离cpu越 ...

  10. XMPP即时通讯协议使用(一)——Openfire安装

    Openfire服务器安装 下载地址:https://www.igniterealtime.org/downloads/index.jsp,根据你的操作系统,选择对应的下载版本.本文选择的是openf ...