题解 [JOI 2019 Final] 独特的城市
题面
解析
首先有一个结论,
对一个点\(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] 独特的城市的更多相关文章
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- 题解 [JOI 2019 Final] 硬币收藏
题面 解析 首先题目可以理解为把一些点放进一个框里,每个格子只能放一个. 那么显然你可以先把这个点移到框里离它最近的格子里, (这个时候格子里可以放很多个) 然后再在框里乱跑移动. 那么我们先考虑只有 ...
- 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...
- JOI 2019 Final合集
JOI 2019 Final 合集 #3010. 「JOI 2019 Final」勇者比太郎 其实如果读懂题了就是水题了 题目就是让你求满足条件的\(JOI\),使得\(O\)在\(J\)同行的 ...
- loj 3014「JOI 2019 Final」独特的城市
loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长 ...
- 「JOI 2019 Final」 硬币收藏
题目链接 戳我 \(Solution\) 先将所有棋子移动到最近的目标点上 我们设两个变量\(ans1,ans2\)表示到目前为止这个点上可以移动棋子的数目,然后\(f[i][j]\)表示\((i,j ...
- 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)
[题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...
- JOI 2018 Final 题解
题目列表:https://loj.ac/problems/search?keyword=JOI+2018+Final T1 寒冬暖炉 贪心 暴力考虑每相邻两个人之间的间隔,从小到大选取即可 #incl ...
- 「JOI 2017 Final」JOIOI 王国
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...
随机推荐
- Postman和jmeter的区别
1.创建接口用例集(没区别) Postman是Collections,Jmeter是线程组,没什么区别. 2.步骤的实现(有区别) Postman和jmeter都是创建http请求 区别1:postm ...
- Django之Form与ModelForm组件
Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...
- 1262: 谁不爱打牌(Java)
WUSTOJ 1262: 谁不爱打牌 转自 断-肠-人的博客 Java代码在文末 Description BobLee最近在复习考研,但是他也喜欢打牌(有谁不爱玩牌呢?).但是作为一名ACMER,斗地 ...
- JVM GC 算法原理(转)
出处: https://mp.weixin.qq.com/s/IfUFuwn8dsvMIhTS3V01FA 对于JVM的垃圾收集(GC),这是一个作为Java开发者必须了解的内容,那么,我们需要去了解 ...
- 使用Struts2实现图片上传和拦截器
今天来分享一个图片上传 现在很多小项目里面基本上都有要显示图片的功能,所以呢图片上传是基本要掌握的啦 一般的图片上传原理就是从本地选择一张图片然后通过io流发布到服务器上去 上传方案基本有三种: 1. ...
- javascript 正则表达式的简单操作
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! RegExp 正则表达式是描述字符模式的对象. 正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模 ...
- 给初学PHP的学习线路和建议
直入主题 1.熟悉HTML/CSS/JS等网页基本元素,完成阶段可自行制作简单的网页,对元素属性相对熟悉. 2.理解动态语言的概念和运做机制,熟悉基本的PHP语法. 3.学习如何将PHP与HTML结 ...
- (六)Activiti之实现学生请假流程
一.实现学生请假流程 1.1 用activiti插件生成bpmn和png文件 1.2 部署流程定义 package com.shyroke.activiti.firstActiviti; import ...
- C#使用HtmlAgilityPack快速爬虫
HtmlAgilityPack真是一把网抓利器,可以迅速地从网页抓到想要的文本或数据,使用起来十分方便,引用时在NuGet安装添加并在头部引用using HtmlAgilityPack;即可. 针对网 ...
- 【前端】安装wampserver提示丢失MSVCR100.dll的解决方法
先装Visual C++,再装wampserver 下载的时候请注意选择对应的32bit还是64bit的.然后安装. 再安装wamp