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

显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值

用一个栈统计可以被统计的点,然后我们把这棵树长链剖分,每次在所有轻儿子中找深度最大的,去掉距离u小于这个深度的栈里的点,然后去计算u的重儿子

然后去掉距离u小于重儿子深度栈里的点,但是要再把u加进去,再遍历u的其他儿子

最后重新去掉u,计算答案,用直径两端当根都做一遍,取深度较大的那个

统计的话直接在外面开一个数组,弹出弹入的时候判断以下就好了

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 200005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int to,next;
}E[MAXN * 2];
int N,M,dep[MAXN],mx[MAXN],son[MAXN],head[MAXN],sumE,S,T,c[MAXN];
int sta[MAXN],top,all;
int cnt[MAXN],ans[MAXN];
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
void dfs(int u,int fa) {
son[u] = 0;
mx[u] = dep[u];
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa) {
dep[v] = dep[u] + 1;
dfs(v,u);
if(mx[v] > mx[son[u]]) son[u] = v;
mx[u] = max(mx[u],mx[v]);
}
}
}
void ins(int x) {
sta[++top] = x;
x = c[x];
if(cnt[x] == 0) ++all;
++cnt[x];
}
void del() {
int x = sta[top--];
x = c[x];
if(cnt[x] == 1) --all;
--cnt[x];
}
void calc(int u,int fa) {
if(!son[u]) {
ans[u] = max(ans[u],all);return;
}
int ol = 0;
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa && v != son[u]) {
ol = max(ol,mx[v] - dep[u]);
}
}
while(top && dep[sta[top]] + ol >= dep[u]) del();
ins(u);calc(son[u],u);
while(top && dep[sta[top]] + mx[son[u]] - dep[u] >= dep[u]) del();
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa && v != son[u]) {
if(sta[top] != u) ins(u);
calc(v,u);
}
}
while(top && dep[sta[top]] + mx[son[u]] - dep[u] >= dep[u]) del();
ans[u] = max(ans[u],all);return;
}
void Solve() {
read(N);read(M);
int a,b;
for(int i = 1 ; i < N ; ++i) {
read(a);read(b);
add(a,b);add(b,a);
}
for(int i = 1 ; i <= N ; ++i) read(c[i]);
dep[1] = 0;dfs(1,0);
S = 1;
for(int i = 2 ; i <= N ; ++i) {
if(dep[i] > dep[S]) S = i;
}
dep[S] = 0;dfs(S,0);
T = 1;
for(int i = 2 ; i <= N ; ++i) {
if(dep[i] > dep[T]) T = i;
}
dep[S] = 0;dfs(S,0);top = 0;
calc(S,0);
memset(cnt,0,sizeof(cnt));all = 0;
dep[T] = 0;dfs(T,0);top = 0;
calc(T,0);
for(int i = 1 ; i <= N ; ++i) {
out(ans[i]);enter;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)的更多相关文章

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

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

  2. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  3. LOJ#2764. 「JOI 2013 Final」JOIOI 塔

    题目地址 https://loj.ac/problem/2764 题解 真的想不到二分...不看tag的话... 考虑二分答案转化为判定问题,那么问题就变成了能不能组合出x个JOI/IOI,考虑贪心判 ...

  4. LOJ#2343. 「JOI 2016 Final」集邮比赛 2

    题目地址 https://loj.ac/problem/2343 题解 首先处理出\(f[i]\)表示以当前位置开头(J,O,I)的合法方案数.这个显然可以\(O(n)\)处理出来.然后考虑在每个位置 ...

  5. loj 2759「JOI 2014 Final」飞天鼠

    loj 这题有在一棵树上上升或者下降的操作,稍加分析后可以发现上升操作如果不是一定要做(指高度不足以到下一棵树或者是最后到达\(n\))就不做,下降操作也是如果不是一定要做(指到达下一棵树时高度过高) ...

  6. loj 2336「JOI 2017 Final」绳

    loj 首先,所有位置最多被染色一次,因为要染多次的话,还不如一开始就染成最终的颜色.并且你可以一开始就染好色 因为最终长度为2,那么如果染完后这个序列可以被折完,那么首先最多只有两种颜色,还有就是要 ...

  7. 「JOI 2019 Final」 硬币收藏

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

  8. loj#2334 「JOI 2017 Final」JOIOI 王国

    分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace s ...

  9. loj#2333 「JOI 2017 Final」准高速电车

    分析 我们发现到达一个点一定是先快车再准快车再慢车 于是快车将1-n分为多个区间 每次取出每个区间当前能到达的点的数量 选剩余时间贡献最大的的一个取得贡献并且再能到达的最远点建立准快车 代码 #inc ...

随机推荐

  1. 蓝桥 log大侠

    标题:Log大侠 atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠. 一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力... 变换的规则是: ...

  2. Cogs 728. [网络流24题] 最小路径覆盖问题

    [网络流24题] 最小路径覆盖问题 ★★☆ 输入文件:path3.in 输出文件:path3.out 评测插件 时间限制:1 s 内存限制:128 MB 算法实现题8-3 最小路径覆盖问题(习题8-1 ...

  3. windows下mysql 主库从库同步

    今天先讲讲数据库的主从同步,两个好处: 一是读写分离可以用上.比如 写操作就写到主数据库,读就再从库读取 二是纯粹给数据库备份,以防硬盘彻底崩了 主从数据库操作准备: 两台电脑,都安装好mysql 5 ...

  4. 下载 OllyDbg

    http://www.ollydbg.de/

  5. Zookeeper系列(十)zookeeper的服务端启动详述

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6105276.html尊重原创,大家功能学习进步:  一.前 ...

  6. SilverFish

    noHero123/silverfish https://github.com/noHero123/silverfish/blob/master/HrtBddy/instructions.txt Ho ...

  7. win10下EditPlus不能拖拽打开文件

    今天找到篇blog,终于把win10下EditPlus不能拖拽打开文件的问题解决了:) 记录下备忘.之前通过注册表的方式添加到右键菜单,当时设置了EditPlus以管理员身份运行: 解决办法=> ...

  8. incredibuild(分布式任务软件)脚本

    IncrediBuild 可以在Server段通过修改单个任务的进程上限来实现提升任务执行速度. IncredBuild本机版也可以用来进行本机实现多线程任务分发,这样可以充分利用多核资源. 提交分布 ...

  9. 中间件 | kafka简介、使用场景、设计原理、主要配置及集群搭建

    开源Java学习 公众号 一.入门 1.简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性 ...

  10. 前端知识点回顾之重点篇——CSS中vertical align属性

    来源:https://www.cnblogs.com/shuiyi/p/5597187.html 行框的概念 红色(line-height)为行框的顶部和底部,绿色(font-size)为字体的高度, ...