【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
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」独特的城市(长链剖分)的更多相关文章
- loj 3014「JOI 2019 Final」独特的城市
loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长 ...
- LOJ#2351. 「JOI 2018 Final」毒蛇越狱
LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...
- LOJ#2764. 「JOI 2013 Final」JOIOI 塔
题目地址 https://loj.ac/problem/2764 题解 真的想不到二分...不看tag的话... 考虑二分答案转化为判定问题,那么问题就变成了能不能组合出x个JOI/IOI,考虑贪心判 ...
- LOJ#2343. 「JOI 2016 Final」集邮比赛 2
题目地址 https://loj.ac/problem/2343 题解 首先处理出\(f[i]\)表示以当前位置开头(J,O,I)的合法方案数.这个显然可以\(O(n)\)处理出来.然后考虑在每个位置 ...
- loj 2759「JOI 2014 Final」飞天鼠
loj 这题有在一棵树上上升或者下降的操作,稍加分析后可以发现上升操作如果不是一定要做(指高度不足以到下一棵树或者是最后到达\(n\))就不做,下降操作也是如果不是一定要做(指到达下一棵树时高度过高) ...
- loj 2336「JOI 2017 Final」绳
loj 首先,所有位置最多被染色一次,因为要染多次的话,还不如一开始就染成最终的颜色.并且你可以一开始就染好色 因为最终长度为2,那么如果染完后这个序列可以被折完,那么首先最多只有两种颜色,还有就是要 ...
- 「JOI 2019 Final」 硬币收藏
题目链接 戳我 \(Solution\) 先将所有棋子移动到最近的目标点上 我们设两个变量\(ans1,ans2\)表示到目前为止这个点上可以移动棋子的数目,然后\(f[i][j]\)表示\((i,j ...
- loj#2334 「JOI 2017 Final」JOIOI 王国
分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace s ...
- loj#2333 「JOI 2017 Final」准高速电车
分析 我们发现到达一个点一定是先快车再准快车再慢车 于是快车将1-n分为多个区间 每次取出每个区间当前能到达的点的数量 选剩余时间贡献最大的的一个取得贡献并且再能到达的最远点建立准快车 代码 #inc ...
随机推荐
- Django基础之response对象
与由DJango自动创建的HttpRequest对象相比, HttpResponse对象是我们的职责范围了. 我们写的每个视图都需要实例化, 填充和返回一个HttpResponse. HttpResp ...
- jQuery的入口函数
原生的JS的入口函数指的是:window.onload = function(){}: 如下所示: //原生js的入口函数.页面上所有内容加载完毕, 才执行.//不仅要等文本加载完毕, 而且要等图片也 ...
- MIME协议(五) -- MIME邮件的编码方式
5 MIME邮件的编码方式 由于每个ASCII码字符只占用一个字节(8个bit位),且最高bit位总为0,即ASCII码字符中的有真正意义的信息只是后面的7个低bit位,而传统的SMTP协议又是基于 ...
- flask静态html
flask使用静态html 在flask并不是所有的html都需要做成动态html,并且做成动态html在使用静态资源时要改变它的路径.所以我们有些可以使用静态html. 静态html不需要后台渲染, ...
- mac 安装laravel
安装laravel之前先安装composer 使用 curl 指令下载: curl -sS https://getcomposer.org/installer | php 或是沒有安裝 curl ,也 ...
- MySQL:行锁、表锁、乐观锁、悲观锁、读锁、写锁
1.锁的分类 1.1从对数据操作的类型来分 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响. 结论1: --如果某一个会话 对A表加了read锁,则 该会话 可以对A表进行读操作 ...
- 手把手教你用蒲公英获取udid
如果需要获取udid,但是拥有手机的测试用户身边没有mac电脑和xcode环境, 今天就分享一个快捷的在线获得udid的方法 利用蒲公英网站的获取udid功能 手机浏览器访问 http://www.p ...
- CSS 优先级法则
样式的优先级 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External styl ...
- 在Eclipse中使用WindowBuilder设计Swing程序
在Eclipse中使用WindowBuilder设计Swing程序 Swing程序表示Java的客户端窗体程序,除了通过手动编写代码的方式设计Swing程序之外,Eclipse中还提供了一种W ...
- 排错:Unable to create a new session key. It is likely that the cache is unavailable.
排错:Unable to create a new session key. It is likely that the cache is unavailable. 问题 登录openstack页面, ...