首页 > 其他分享 >CF1790F题解

CF1790F题解

时间:2023-12-02 17:00:12浏览次数:39  
标签:CF1790F int 题解 KMaxN 黑点 ans 1e9 dis

思路

令 $dis_i$ 为离 $i$ 最近的黑点距离, $ans$ 是距离最近的一对黑点距离, 我们可以发现, 每次 $i \gets i + 1$ 后 $ans$ 的更新只会与 $dis_{c_i}$ 有关, 因为 $c_i$ 是新的黑点, 然后再从 $c_i$ 来一次 BFS 更新 $dis_i$ 即可。

更详细的在注释。

代码

#include <bits/stdc++.h>

using namespace std;

const int KMaxN = 2e5 + 1;

int n, c[KMaxN], t, u, v, dis[KMaxN]/* 离 i 最近的黑点距离 */, ans = 1e9;
vector<int> g[KMaxN]; // 存边

void bfs(int s) { // 从 s 做一次 BFS 更新
  dis[s] = 0;
  queue<int> q;
  q.push(s);
  while (!q.empty()) {
    int t = q.front();
    q.pop();
    if (dis[t] >= ans) { // 优化:当当前点 i 最近黑点的距离大于最小值 ans, 可以直接不用搜了
      break;
    }
    for (int i : g[t]) {
      if (dis[i] <= dis[t] + 1) {
        continue;
      }
      dis[i] = dis[t] + 1; // 更新
      q.push(i);
    }
  }
}

int main() {
  for (cin >> t; t; t-- , ans = 1e9) { // t 次询问
    cin >> n >> c[0];
    fill(dis + 1 , dis + n + 1 , 1e9);
    for (int i = 1; i < n; i++) {
      g[i].clear();
      cin >> c[i];
    }
    g[n].clear();
    for (int i = 1; i < n; i++) {
      cin >> u >> v;
      g[u].push_back(v);
      g[v].push_back(u);
    }
    bfs(c[0]); // 先对 c[0] 做一次 BFS
    for (int i = 1; i < n; i++) {
      ans = min(ans, dis[c[i]]); // 只有 dis[c[i]] 对 ans 有影响
      cout << ans << " ";
      bfs(c[i]); // 更新 dis
    }
    cout << "\n";
  }
  return 0;
}

标签:CF1790F,int,题解,KMaxN,黑点,ans,1e9,dis
From: https://www.cnblogs.com/WUYIXUAN-NAUXIYUW/p/17871853.html

相关文章

  • [题解]AT_abc224_e [ABC224E] Integers on Grid
    比较符合CCF造数据水平的题。思路首先可以用两个vector<pair<int,int>>v[N]分别将每一行、每一列的元素的权值与编号存储下来。那么可以对所有的\(v_i\)按照权值从小到大排序。那么发现对于所有的满足v[i][p].fst<v[i][q].fst的\((p,q)\)都可以建一条从\(p\)指......
  • CSP第31次认证题解 2023.9
    A、坐标变换(其一)样例输入3210100010-201-100样例输出21-1120-10题解按照题目,一个循环即可#include<bits/stdc++.h>usingnamespacestd;#defineN200010#definelllonglongtemplate<classT>inlinevoidread(T&a){Tx=0,s=1;......
  • 使用Navicat For MSSQL连接绿色版SQLServer2008R2问题解决
    问题1、创建连接时出现错误:[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0)Navicat来连接SQLserver,这里确实有点麻烦,出现错误[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0),解决方法:进入Navicat的安装......
  • CF1368题解
    CF1368CodeforcesGlobalRound8ABC略。CF1368DlinkCF1368D题意给定\(n\)个非负整数\(a_1,\cdots,a_n\)。你可以进行如下操作:选择两个不同的下标\(i,j\)满足\(1\leqi,j\leqn\),并将\(a_i\getsa_i\\mathsf{AND}\a_j,\a_j\getsa_i\\mathsf{OR}\a_j\),两个赋值......
  • newstarctf2023 reverse 题解汇总
    newstarctf2023reverse题解汇总week1easy_REdie查无壳64直接IDA启动跟到main函数找到两部分flag拼起来就行了。flag{we1c0me_to_rev3rse!!}ELFdie查64ELFIDA启动稍微读一下写个py逆一下它的加密就行了flag{D0_4ou_7now_wha7_ELF_1s?}importbase64a="VlxRV......
  • ISCTFpwn的ezpie题解
    目前接触的随机好像都与地址有关,而且还有一个特性也就是只是基址随机,只要有任意一个地址就可以知道其他所有具体地址。(libc和pie保护)这里将通过ezpie这道题介绍绕过pie的一种方式,泄露地址一获取全部地址的方法。本人还不太懂partiallywrite的原理,就不误人子弟了。这里我们看到v5......
  • 【POJ 1144】Network 题解(Tarjan算法求无向图的割点)
    一家电话线公司(TLC)正在建立一个新的电话电缆网络。它们连接由1到N的整数编号的几个位置。没有两个地方的数字相同。这些线路是双向的,总是连接在两个地方,在每一个地方,线路都以电话交换机结束。每个地方都有一个电话交换机。从每个地方可以通过其他地方的线路到达,但不需要直接连接,可......
  • P9879 题解
    blog。找网络流水题写题解/hsh。间隔染色(\(i+j\)分奇偶染不同色)后,所有\(i+j\)为奇数的格子反色,题目的Pattern等价于是\(2\times2\)的全黑或全白格子。然后很自然地想Flow了。每个点分黑白两种状态。如果\((x,y)\)对应的Pattern有机会染成全黑,就连边\(S\xright......
  • 2023ISCTFpwn题目:stack题解
    这是我在这次比赛中遇到最有意思的一题,不仅让我看到了一种有意思的题型,而且让我开始看懂了pwndbg的调试界面。IDA里面是这样的,有直接可以提权的backdoor函数,有read函数,看似有点像ret2system。让我们分析一下这个函数的读入逻辑:首先让你输入一个size值,read会总共分size次读入一个字......
  • C#把listA通过“=”赋值给listB,然后对listA进行clear清空,第二个listB也清空了问题解决
    针对ArrayList赋值到另一个ArrayList的方法ArrayList<String>A=newArrayList<String>();A.add("1");A.add("2");ArrayList<String>B=newArrayList<String>();;B=A;A.clear();A清空后发现B也清空了。此时B对象相当与A对象的引用,而并不是将A对象的值单纯的传递给......