首页 > 其他分享 >Solution - Atcoder APC001E Antennas on Tree

Solution - Atcoder APC001E Antennas on Tree

时间:2024-07-30 17:19:40浏览次数:17  
标签:Atcoder 子树 int Tree 节点 选中 Antennas mx 关键点

首先考虑判定什么样的选取是合法的。

考虑到令任意一个点 \(u\) 为根。
若 \(u\) 有至少两个子树没有点选中,那么这两个子树是无法区分的。

所以可以知道需要满足任意一个点为根,都至多存在一个子树内部没有选中的点。

接下来就要贪心的选出最少的点了。

考虑对于每个点的限制都是子树。
不难想到把关键点都移到叶子节点肯定最优。

不妨假设所有的叶子节点都要被选中,这样首先肯定是满足条件的。

考虑一个 \(\operatorname{deg} > 2\) 的点 \(u\),这里必然有几个子树在此合并。
若一个子树其实是一条链,那么能够知道这条链就肯定是不用选的了。
这是因为链内部其实不需要一个关键点,因为如果链上的点为根,那么 \(u\) 这边一定有关键点;如果是链外的非 \(u\) 点为根,链所在的子树肯定存在关键点;如果是 \(u\) 点为根,那么非链的子树有关键点。
不能是非链的子树的原因就是因为此时这个子树中肯定也存在 \(\operatorname{deg} > 2\) 的点,实际上应该交给这个点来决定。

实现时可以考虑直接从叶子节点开始往上跳链。

注意特判下链的情况,这个时候选中一个叶子节点即可,答案为 \(1\)。

时间复杂度 \(\mathcal{O}(n)\)。

#include<bits/stdc++.h>
const int maxn = 1e5 + 10;
std::vector<int> to[maxn];
int vis[maxn];
int main() {
   int n; scanf("%d", &n);
   for (int i = 1, x, y; i < n; i++)
      scanf("%d%d", &x, &y), to[x].push_back(y), to[y].push_back(x);
   int mx = 0;
   for (int i = 0; i < n; i++)
      mx = std::max(mx, (int)to[i].size());
   if (mx <= 2)
      return puts("1"), 0;
   int ans = 0;
   for (int i = 0; i < n; i++)
      if (to[i].size() == 1) {
         int u = i, v = to[i][0];
         for (int p; to[v].size() == 2; p = to[v][0] ^ to[v][1] ^ u, u = v, v = p);
         ans += (vis[v]++) > 0;
      }
   printf("%d\n", ans);
   return 0;
}

标签:Atcoder,子树,int,Tree,节点,选中,Antennas,mx,关键点
From: https://www.cnblogs.com/rizynvu/p/18332944

相关文章

  • Solution - Atcoder AGC028B Removing Blocks
    因为贡献的方法是相加,一种想法就是拆开,对每一项单独贡献。不难发现这题目中的贡献其实只涉及到两点之间。即删除\(x\)时\(y\)也产生了贡献。考虑这个贡献会在多少种排列中出现。令\(d=|x-y|+1\),即\(x,y\)中的点数。能发现排列需要满足除\(x\)外的\(d-1\)......
  • Atcoder ABC364 D-F
    AtcoderABC364D-FD-K-thNearest链接:D-K-thNearest(atcoder.jp)简要题意:问题陈述在一条数线上有\(N+Q\)个点\(A_1,\dots,A_N,B_1,\dots,B_Q\),其中点\(A_i\)的坐标为\(a_i\),点\(B_j\)的坐标为\(b_j\)。请就每个点\(j=1,2,\dots,Q\)回答下面的问题:......
  • P9058 [Ynoi2004] rpmtdq 与 P9678 [ICPC2022 Jinan R] Tree Distance
    思路:注意到点对数量有\(N^2\)个,考虑丢掉一些无用的点对。对于点对\((x_1,y_1),(x_2,y_2)\),满足\(x_1\lex_2<y_2\ley_1\),即区间\([x_2,y_2]\)被\([x_1,y_1]\)包含,此时满足若询问到了\([x_1,y_1]\),则一定会询问到\([x_2,y_2]\)。若满足\(\operatorname{dis}(x_1......
  • Solution - Atcoder YPC2019E Odd Subrectangles
    首先对于\(0/1\)和为奇数,转化为异或为\(1\)来考虑。考虑如果已经确定了行的选取,又该如何计数。考虑对于每一列,都处理好在对应行的位置的异或值。然后记\(\operatorname{c}_0,\operatorname{c}_1\)表示列异或值为\(0/1\)的数量。知道了\(\operatorname{c}_0,\op......
  • Solution - Atcoder UTPC2023P Priority Queue 3
    考虑找一些关于合法的\(X\)加入的数的判定条件。假设遇到了一个\(\operatorname{pop}\)操作,令这里删除的数为\(a_i\),显然\(X\)中的数应该要有\(a_i\),其次\(X\)中其他的加入的数要么\(>a_i\)要么是\(a\)中的元素(在前面的\(\operatorname{pop}\)就已经被删了)。于......
  • AtCoder Beginner Contest 362
    AtCoderBeginnerContest362前言vp的时候出了四题,被C题卡了一会,很久才出,D题是dijkstra的板子,改下条件即可,E题是个计数dp,这类题一直不怎么擅长,想起之前杭电第一场那个序列立方的题也是类似这种计数dp,需要加强练习。A-BuyaPen(atcoder.jp)思路判断两两最小。......
  • Solution - Atcoder ABC280Ex Substring Sort
    对于这种子串问题,且有多个基础串,一个比较直观的想法就是先上个广义SAM。考虑SAM与字典序如何联系上。因为跳\(\operatorname{fail}\)相当于是删除子串的一个前缀,直接这样子明显是不行的,因为跳了\(\operatorname{fail}\)字典序没有一个很直观地表示。但是反过来考虑反串,......
  • dsu on tree 模板
    dsuontree模板运用例题以及代码:U41492树上数颜色-洛谷|计算机科学教育新生态(luogu.com.cn)记录详情-洛谷|计算机科学教育新生态(luogu.com.cn)Lomsatgelral-洛谷|计算机科学教育新生态(luogu.com.cn)记录详情-洛谷|计算机科学教育新生态(luogu.com.......
  • KD-Tree 学习笔记
    KD-Tree学习笔记建树如果当前超长方体只有一个点,返回这个点选择一个维度(轮流)选择中位数(\(O(n)\))递归应用定理二维KDT中节点代表矩阵与任意一个矩形(边界上)有交的只有\(O(\sqrtn)\)个。证明:考虑一条直线,与KDT的交集,此层最多有两个,递归得到递归式,然后套主定理。......
  • Solution - Atcoder ARC114F Permutation Division
    令\(a\)为题目中的\(P\)。首先考虑后手的重排策略是什么。因为\(a\)是个排列,元素互不相同,那么肯定就是按照每一段的第一个数的大小,越大的放在越前面。那么当\(a_1\lek\)的时候,显然先手会把以\(1\simk\)开头来划分段。因为否则存在一个开头\(>k\)的段,后手把其放......