题面

解析

首先有一个结论,

对一个点\(x\)有贡献的城市

肯定在它到离它较远的直径的端点的链上.

假设离它较远的端点是\(S\),

如果有一个点\(u\)不在\(x\)到\(S\)的链上,

却对\(x\)有贡献,

那就说明\(x\)到\(u\)的距离比\(x\)到\(S\)要长,

但根据直径的定义,这是不可能的.

接下来就要考虑怎么算答案了.

首先找出直径的两个端点,

分别作为根统计一次.

维护一个栈,栈里面是可能对\(x\)有贡献的点.

然后考虑长链剖分,求出长链和次长链.

那么对于重儿子来说,栈里面的离\(x\)的距离小于等于次长链的长度的点肯定就要弹掉.

因为对重儿子没有贡献,

然后就去统计重儿子答案.

再把离\(x\)距离小于等于长链的长度的点弹掉,

剩下的就是有贡献的点了.

统计的话我们可以维护一个全局的桶,

在进栈和出栈时统计一下.

最后去统计轻儿子就行了.

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std; inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} const int N=1000005;
struct edge{int to,next;}e[N];
int n,m,a[N],S,T,maxn;
int dep[N],len[N],son[N],sson[N];
int t[N],ans[N],now;
int sta[N],top;
int head[N],cnt; inline void add(int x,int y){
e[++cnt]=(edge){head[x],y};head[x]=cnt;
} inline void dfs(int x,int fa,int dep){
dep++;if(dep>maxn) S=x,maxn=dep;
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(k==fa) continue;
dfs(k,x,dep);
}
} inline void pre(int x,int fa){
dep[x]=dep[fa]+1;len[x]=1;
son[x]=sson[x]=0;
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(k==fa) continue;
pre(k,x);
if(len[k]>len[son[x]]) sson[x]=son[x],son[x]=k,len[x]=len[k]+1;
else if(len[k]>len[sson[x]]) sson[x]=k;
}
} inline void add(int x){
t[a[x]]++;
if(t[a[x]]==1) now++;
} inline void del(int x){
t[a[x]]--;
if(!t[a[x]]) now--;
} inline void dfs2(int x,int fa){
while(top&&dep[x]-dep[sta[top]]<=len[sson[x]]) del(sta[top--]);
sta[++top]=x;add(x);
if(son[x]) dfs2(son[x],x);
while(top&&dep[x]-dep[sta[top]]<=len[son[x]]) del(sta[top--]);
ans[x]=max(ans[x],now);
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(k==fa||k==son[x]) continue;
if(sta[top]!=x) sta[++top]=x,add(x);
dfs2(k,x);
}
if(sta[top]==x) top--,del(x);
} signed main(){
n=read();m=read();
for(int i=1;i<n;i++){int x=read(),y=read();add(x,y);add(y,x);}
for(int i=1;i<=n;i++) a[i]=read();
dfs(1,0,0);
T=S;S=maxn=0;
dfs(T,0,0);
pre(S,0);
dfs2(S,0);
pre(T,0);
dfs2(T,0);
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}

题解 [JOI 2019 Final] 独特的城市的更多相关文章

  1. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  2. 题解 [JOI 2019 Final] 硬币收藏

    题面 解析 首先题目可以理解为把一些点放进一个框里,每个格子只能放一个. 那么显然你可以先把这个点移到框里离它最近的格子里, (这个时候格子里可以放很多个) 然后再在框里乱跑移动. 那么我们先考虑只有 ...

  3. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  4. JOI 2019 Final合集

    JOI 2019 Final 合集 #3010. 「JOI 2019 Final」勇者比太郎 其实如果读懂题了就是水题了 题目就是让你求满足条件的\(JOI​\),使得\(O​\)在\(J​\)同行的 ...

  5. loj 3014「JOI 2019 Final」独特的城市

    loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长 ...

  6. 「JOI 2019 Final」 硬币收藏

    题目链接 戳我 \(Solution\) 先将所有棋子移动到最近的目标点上 我们设两个变量\(ans1,ans2\)表示到目前为止这个点上可以移动棋子的数目,然后\(f[i][j]\)表示\((i,j ...

  7. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  8. JOI 2018 Final 题解

    题目列表:https://loj.ac/problems/search?keyword=JOI+2018+Final T1 寒冬暖炉 贪心 暴力考虑每相邻两个人之间的间隔,从小到大选取即可 #incl ...

  9. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

随机推荐

  1. VirtualBox中CentOS7.2 网络配置(固定IP+联网)(亲测有效)

           https://www.linuxidc.com/Linux/2018-04/151924.htm 一.前言 用虚拟机装Linux系统时,经常会出现一些问题.比如:从主机到虚拟机之间网络 ...

  2. 20191030-带返回值的回溯算法Leetcode解数独

    题目描述 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔 ...

  3. 软件模拟IIC实现EEPROM

    ....妈的太难.    反正就是控制引脚的高低电平 实现数据的读取....参考 I2C的协议层和物理层的那个几个图,个个信号产生的电平 自己看源码去把. 头疼

  4. 使用HSI配置系统时钟

    这里我就直接粘代码了.很简单.上节理解了 这也就能简单了. void HSI_SetSysClk( uint32_t RCC_PLLMul_x ) { __IO uint32_t HSIStatus ...

  5. MySQL explain功能展示的各种信息的解释

    1.id: MySQL Query Optimizer 选定的执行计划中查询的序列号. 2.select_type: 所使用的查询类型,主要有以下这几种查询类型.  DEPENDENT SUBQUER ...

  6. 使用Duilib开发Windows软件(5)——使用VLC做视频播放

    需求:调用PC上的摄像头拍照. 实现思路:接入视频流,截屏获取照片. 早期的vlc安装包(Windows)是附带sdk包的,现在的安装后已经没有了,原因如下: VLC SDK下载连接:https:// ...

  7. MyBatis_01 框架

    Mybatis概述 Mybatis是什么 Mybatis是一个持久层框架.   Mybatis的作用 Mybatis是一个持久层框架,当然作用就是操作数据库的(增删改查).   为什么需要学习Myba ...

  8. THUPC2019/CTS2019/APIO2019游记

    Day -? 居然还能报上thupc,我在队里唯一的作用大约是cfrating稍微高点方便过审.另外两位是lz和xyy. Day -2 我夫人生日! Day -1 lz和xyy的家长都来了带我飞.住在 ...

  9. hdu 6180贪心

    题意:有m个工程,一台机器在同一时间只能运行一个工程,告诉你每个工程的起始时间和结束时间,求出最少要多少个机器以及最小的机器总运行时间(机器开始了就不能停了,直到用完该台机器才停止). 题解:由于这里 ...

  10. 组装技术的新进展 New advances in sequence assembly.

    组装技术的新进展 1.测序和组装 很难想象今天距离提出测序和组装已经有40年啦.我们回头来看一下这个问题. “With modern fast sequencing techniques and su ...