[CSP-S模拟测试]:Endless Fantasy(DFS)
题目描述
中二少年$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)的更多相关文章
- [CSP-S模拟测试]:虎(DFS+贪心)
题目传送门(内部题15) 输入格式 第一行一个整数$n$,代表点数接下来$n-1$行,每行三个数$x,y,z$,代表点$i$与$x$之间有一条边,若$y$为$0$代表初始为白色,否则为黑色,若$z$为 ...
- [CSP-S模拟测试]:世界线(DFS+bitset)
题目描述 时间并不是一条单一的线,而是有许多世界线构成的流. 在一些时刻,世界线会发生分裂:同样的,它们也有可能在一些时刻收束在一起.如果将这些时刻抽象成点,那么这些世界线构成的网络,实际上是一张有向 ...
- csp-s模拟47 Emotional Flutter,Endless Fantasy题解
题面:https://www.cnblogs.com/Juve/articles/11558523.html A:Emotional Flutter 如果起点确定,那么我们后面走的点都是固定的,及mo ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
- [CSP-S模拟测试47]反思+题解
打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...
- 2019.9.19 csp-s模拟测试47 反思总结
思路接近正解?都想到了?这都是借口呀. 没有用的,往前走吧. T1:Emotional Flutter 我的做法和题解不太一样,我把s放在最后考虑了. 因为出发以后步幅是一样的,所以每一个黑条可以ba ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
随机推荐
- 使用pgAdmin3将postgreSQL中的数据导出insert格式的sql文件
第一步: 第二步: 第三步: 第四步: 成功:
- eval方法遇到的问题
工作中有这样的场景,一个表达式比如 2*2,计算结果是number,这样的为true,如果输入错误 2*@,这样的情况需要匹配为false. 这里使用的eval方法, type of (eval('2 ...
- vs报错 "多步操作产生错误。请检查每一步的状态值"
今天在开发一个插件图表控件,在实例化后向数据库Update时候,报出此错误,刚开始以为是我用的异步方法,在调用程序的句柄的时候的线程问题,索性改成了同步方法,仍然报出此错误.后来Debug和排错,定位 ...
- Altium Designer chapter1总结
第一章操作基础中有以下几点需要注意: (1)随着DSP.ARM.FPGA等高速逻辑元件的应用,PCB的信号完整性与抗干扰性能显得尤为重要. (2)Altium Designer的发展史:Protel ...
- WildFly的学习
1. WildFly介绍: WildFly,前身是JBoss AS,从V8开始为区别于JBoss EAP,更名为WildFly. 由红帽 (Red Hat)开发,是另一个功能齐全且经过认证的应用服务器 ...
- Eclipse+Pydev环境下出现error “eclipse Non-UTF-8 code”
文件首行加上”#coding=utf-8” ,这一句话可控制代码中可输入中文字符
- Learning OSG programing---Multi Camera in Multi window 在多窗口中创建多相机
这个例子演示了在多个窗口中创建多个相机,函数的代码如下: void multiWindowMultipleCameras(osgViewer::Viewer& viewer,bool mult ...
- JavaScript GetAbsoultURl
var img = document.createElement('A'); img.src = "/img/weixin.jpg"; // 设置相对路径给Image, ...
- mybatis 批量update报语法错误解决方法
1.为什么会报语法错误 原因:在 *.xml文件内使用了循环,在mybatis中默认是不允许使用批量修改. <update id="setMaxMin" parameterT ...
- CSS 实现水平垂直居中
使用绝对定位 在已经知道子元素的宽高的时候,子元素设置成绝对定位,top,left,right,bottom=0, margin = auto .wrap{ position: relative; w ...