首页 > 其他分享 >[CF1790F] Timofey and Black-White Tree 题解

[CF1790F] Timofey and Black-White Tree 题解

时间:2023-08-21 21:22:20浏览次数:47  
标签:CF1790F dist 个点 题解 Tree sqrt leq White

[CF1790F] Timofey and Black-White Tree 题解

题目描述

ZYH 有一棵 \(n\) 个节点的树,最初 \(c_0\) 号节点是黑色,其余均为白色。

给定操作序列 \(c_1,c_2,\cdots,c_{n-1}\),第 \(i\) 次操作表示将 \(c_i\) 号节点染黑。每次操作后,输出距离最近的两个黑点间的距离。两点 \(u,v\) 间的距离定义为 \(u\to v\) 的路径上经过的边的条数。

多组数据,\(1\leq T \leq 10^4,2\leq n \leq 2\times 10^5,\sum n\leq 2\times 10^5\),节点编号均在 \([1,n]\) 内。

思路

每次加入一个点暴力统计一遍答案,如果当前距离超过了答案就跳出。

这看着好像很暴力,似乎是平方的,但是其实是根号的,由于这个结论:

在一棵树上随机选择 \(\sqrt n\) 个点它们之间的最小距离一定不超过 \(\sqrt n\)。

证明:

对于一条链的情况,最坏情况是 \(n\) 个点隔 \(\sqrt n\),这种情况下的最小距离最大是 \(\sqrt n\),而对于一棵树,它是不比链的情况优的。

所以对于前 \(\sqrt n\) 个点,考虑最坏情况,即每次跑 \(n\) 个点,而对于后面 \(n- \sqrt n\) 左右个点,根据前面已经证明过的结论,只要我们一旦超过答案就跳出,它们最多会跑 \(\sqrt n\) 次,这是最坏情况,因此总的时间复杂度是 \(O(n\sqrt n)\),类似于根号分治。

// Problem: Timofey and Black-White Tree
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1790F
// Memory Limit: 250 MB
// Time Limit: 4000 ms
// Powered by CP Editor (https://cpeditor.org)
 
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 2e5 + 10;
 
vector<int> g[N];
int q[N], dist[N], ans;
bool vis[N];
inline void bfs(int s) {
    queue<int> q;
    q.push(s);
    dist[s] = 0;
    while(q.size()) {
        int t = q.front();
        q.pop();
        if(dist[t] >= ans) break;
        for(auto v : g[t]) {
            if(dist[v] <= dist[t] + 1) continue;
            dist[v] = dist[t] + 1;
            q.push(v);
        }
    }
}
int n;
inline void work() {
    n = read();
    q[0] = read();
    for(int i = 1; i <= n; i ++) g[i].clear();
    memset(dist, 0x3f, n + 1 << 2);
    for(int i = 1; i < n; i ++) q[i] = read();
    for(int i = 1, a, b; i < n; i ++) {
        a = read(), b = read();
        g[a].push_back(b), g[b].push_back(a);
    }
    ans = n + 1;
    bfs(q[0]);
    for(int i = 1; i < n; i ++) ans = min(ans, dist[q[i]]), bfs(q[i]), write(ans), putchar(' ');
    puts("");
    return ;
}
 
int main() {
    int T = read();
    while(T --) work();
    return 0;
}

标签:CF1790F,dist,个点,题解,Tree,sqrt,leq,White
From: https://www.cnblogs.com/MoyouSayuki/p/17647125.html

相关文章

  • CF1762E Tree Sum 题解
    题意对于一棵\(n\)个节点的树\(T\),定义\(\operatorname{good}(T)\)为真当且仅当边权\(w\in\left\{-1,1\right\}\)且对于任意节点\(u\),均有\(\displaystylef(u)=\prod\limits_{\left(u,v\right)\inE}w\left(u,v\right)=-1\)。求\[\sum\limits_{\operat......
  • RTSP/Onvif视频服务器EasyNVR安防视频云服务调用接口录像会被自动删除的问题解决方案
    EasyNVR安防视频云服务是基于RTSP/Onvif协议接入的视频平台,可支持将接入的视频流进行全平台、全终端的分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。平台丰富灵活的视频能力,可应用在智慧校园、智慧工厂、智慧水利等场景中。有用户反馈,在使用EasyNVR接入设备......
  • [ABC315G] Ai + Bj + Ck = X (1 <= i, j, k <= N) 题解
    [ABC315G]Ai+Bj+Ck=X(1<=i,j,k<=N)题解题目描述求题目中式子的数量。思路因为\(N\le10^6\),所以考虑枚举\(k\),那么变为求\(ai+bj=x-ck,i,j\in[1,N]\),这个问题可以通过Exgcd算法求解。首先考虑求出一组\(i,j\)的特解\(x',y'\),根据通解\(x=x'+......
  • Codeforces Round 893 (Div. 2) A-C题解
    CF893(Div.2)A.Buttons签到题。两人会优先选择c中的按钮来,避免自己的按钮消耗同时减少对方可选择的按钮。所以c%2==1等价于a的按钮数+1,c%2==0时相当于c按钮不存在,比较ab按钮的数量来得出答案即可。#include<iostream>usingnamespacestd;typedeflonglong......
  • [AGC005C] Tree Restoring 题解
    比较简单的题。思路我们可以把一棵树抽象成一条极长的链上挂了很多的点。观察这样的树的性质。除去中间的每一个\(dis\)至少有两个点的\(a_i=dis\)。考虑这条链的长度为\(s\)。那么对于中间的点,我们可以分两种情况讨论。\(s\)为偶数那么我们必然要求在中间的权值只......
  • hive sql运行时候reduce 只有2个问题解决
    我们在explansql时候发现width是负数,事实上原因width是通过dataSize/rowNum计算出来的,这两个参数都是在执行计划中根据每个operator通过stats计算出来的。对于selectquery来说,datasize是根据columnstats、尤其是non-null的数据计算出来的,这些non-nullvalue按照如下公......
  • RTSP/Onvif流媒体服务器EasyNVR安防视频平台一直提示网络请求失败的问题解决方案
    EasyNVR平台优秀的视频能力在于通过RTSP/ONVIF协议,将前端接入设备的音视频资源进行采集,并转码成适合全平台、全终端分发的视频流格式,包括RTMP、RTSP、FLV、HLS、WebRTC等格式。有用户反馈,EasyNVR使用过程中,突然提示网络请求失败,视频也无法播放,请求我们协助排查。此前我......
  • 安防视频监控平台EasyCVR视频集中存储平台接入RTSP设备出现离线情况的问题解决方案
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能......
  • createTreeWalker DOM API All In One
    createTreeWalkerDOMAPIAllInOnedocument.createTreeWalker()createTreeWalker(root)createTreeWalker(root,whatToShow)createTreeWalker(root,whatToShow,filter)https://developer.mozilla.org/en-US/docs/Web/API/Document/createTreeWalkerTheTreeWal......
  • UVA1589 象棋 题解
    0.题目大意在一个\(10\times9\)的网格上,可以游玩象棋。在本题中,我们考虑如下几个简化的规则:每一个棋子下在交点上,一个交点不能同时有两个棋子;棋盘的左上角为\((1,1)\),右下角为\((10,9)\);当一个棋子移动到它的敌人的棋子上,就说敌方的棋子要被“吃掉”。当棋盘上的“将”有......