首页 > 其他分享 >AtCoder Beginner Contest 298

AtCoder Beginner Contest 298

时间:2024-03-04 15:26:22浏览次数:23  
标签:AtCoder 子树 dist Beginner text 距离 eds 298 dis


\[\large \text{Round 5 : AtCoder Beginner Contest 298 (VP)} \]

一言:
成一事者,是失之不渝的愚者;毁一事者,是停滞不前的贤者。
——不正经的魔法讲师

\(\text{Ex: Sum of Min of Length}\)

这次比赛总体难度不是很大,可能也是我第一次自己独立做出 \(\text{Ex}\)。(虽然不是场切,也调了很久,没看题解,所以纪念一下。)

这题维护的东西比较多,下面我们一个一个列出来。(默认以 \(1\) 为根。)

  • \(dep_i\) 表示 \(i\) 节点的深度。

  • \(siz_i\) 表示 \(i\) 子树的大小。

  • \(dis_i\) 表示 \(i\) 到 \(i\) 子树中每个点的距离之和。

  • \(eds_i\) 表示 \(i\) 到每个点的距离之和。

  • \(f_{i,j}\) 表示 \(i\) 的 \(2^j\) 个祖先是谁。

显然,\(dis_i\) 正常当作树形 \(\text{DP}\) 求,\(eds_i\) 就换根求,\(f_{i,j}\) 就是一个倍增,用来求 \(\text{lca}\) 。

接着,对于每一组询问 \((x,y)\),设 \(z=lca(x,y)\)。假设 \(x\) 的深度比 \(y\) 的深度大,否则交换。定义 \(dist\) 为 \(x\) 和 \(y\) 到 \(lca\) 的总和。

首先对于不属于 \(z\) 子树的那一些点,答案显然就是 \(z\) 到哪些点的距离之和 \(eds_z - dis_z\) 在加上 \(z\) 到 \(y\) 的距离(肯定比到 \(x\) 的距离小) 乘上 \(n-size_z\)。(第二部分是因为那些距离还要走到 \(z\))

显然,对于 \(x\) 的 \(\dfrac{dist}{2}\) 级祖先的子树,显然这些点的距离都是到 \(x\) 最小(设这个祖先为 \(k\))。所以这部分答案就是 \(x\) 到所有点的距离,减去 \(x\) 到这个祖先子树以外的距离,也就是 \(eds_x - (eds_z-dis_z)-(n-siz_k) \times \dfrac{dist}{2}\)。

最后对于 \(y\) 的那一部分,也就是 \(y\) 到在 \(z\) 子树中不包含 \(k\) 的子树的点的距离之和。也就是将 \(y\) 到所有点的距离减去 \(y\) 到 \(z\) 子树以外点的距离,再减去 \(k\) 子树中点到 \(y\) 的距离,就是 \(eds_y-dis_k-siz_k\times (dist-\dfrac{dist}{2}) - (eds_z-dis_z)-(n-size_z)\times (dep_y-dep_z)\)。

最后将三部分加起来就是答案。

下面是一些需要特殊处理的情况,每种都需要特殊处理。(至于怎么处理,就举一反三吧。)

  • \(x=y\)

  • \(k=z\)

  • \(z=y\)

\(\text{Submission}\)

\(\text{What I learned:}\)

  • 这场比赛在思想上并没有学到什么特殊的,但是独立做出 \(\text{Ex}\) 还是让我很开心的,增强了一点自信心吧,总之还是要大胆的去实践自己推出来的东西。

标签:AtCoder,子树,dist,Beginner,text,距离,eds,298,dis
From: https://www.cnblogs.com/SFsaltyfish/p/18051864

相关文章

  • AtCoder Beginner Contest 315
    \[\large\text{Round6:AtCoderBeginnerContest315}\]一言:愿悲、爱恋、你和宇宙以及那颗星辰,能够永远拥抱我们。——THEBEYOND-機動戦士ガンダム40周年纪念曲这场打的一般,主要还是一开始网卡爆了把心态弄得很不好,一定程度上影响了发挥。\(\text{G:Ai+Bj+Ck......
  • AtCoder Beginner Contest 310
    \[\large\text{Round8:AtCoderBeginnerContest310(VP)}\]一言:虚伪的眼泪,会伤害别人,虚伪的笑容,会伤害自己。——反叛的鲁鲁修\(\text{F}\)竟然没有第一时间想到状压,还是太蒟了。。\(\text{F:Make10Again}\)这题看到一个子集,再加上子集和的范围只需要考虑小于......
  • AtCoder Beginner Contest 313
    \[\large\text{Round2:AtCoderBeginnerContest313(VP)}\]一言:当我拔出第二把剑时,就是为了我所爱之人——刀剑神域这场比赛真的是大败而归,只A了\(A,B,C,E\)。。。虽然但是,\(F,G\)确实不可做,但是\(D\)题还是有点可惜了。\(\text{D:OddorEven}\)感觉考场......
  • AtCoder Beginner Contest 343
    AtCoderBeginnerContest343比赛链接A-WrongAnswer思路简单的模拟,事实上我们需要注意一下当a和b都为0的情况Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){ inta,b; cin>>a>>b; intans=a+b; //cout<<a+b-1<<en......
  • AtCoder Beginner Contest 343
    基本情况前四题秒了,但是都有不够优雅的地方F知道是线段树,但是写不出来,极其绝望C-343C-343(atcoder.jp)更简洁的回文判断MyCodeboolcheck_p(i64x){std::strings(std::to_string(x));intn=sz(s);for(inti=0;i<n/2;i++){if......
  • AtCoder Beginner Contest 343:起航
    AtCoderBeginnerContest343:起航2024/3/2/22:53有点儿晚了,简单总结一下。前4题都很基础,一点点小思维,其中C题边界又盲目追求刚刚好,WA了一次,总结经验,程序实际设计应该略微大于数据范围。EFG开始就做不动了,只剩了20多分钟,先通读然后看E题,E题读了半天发现大概是体积交并反......
  • AtCoder Beginner Contest 343
    B-AdjacencyMatrix难度:⭐题目大意给定一个无向图的邻接矩阵,问每个节点都和哪些节点相练;解题思路没啥好说的;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineendl'\n'......
  • AtCoder Beginner Contest 343(小白来了)
    A-WrongAnswer思路:给你两个数(A,B0~9)输出非A+B(0~9)解法:许多(A+B)^1等等Code:#include<iostream>usingnamespacestd;intmain(){intA,B;cin>>A>>B;cout<<!(A+B);return0;}B-AdjacencyMatrix思路......
  • AtCoder Beginner Contest 342
    B-Whichisahead?难度:⭐题目大意给定n个人的位置顺序,现有m次询问,给出a,b两个人,问谁在前面;解题思路模拟就行;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineendl......
  • AtCoder DP Contest vp 记录
    题单。A从\(i-1\)与\(i-2\)转移即可。#include<bits/stdc++.h>usingnamespacestd;intn;inth[100031];intdp[100031];intmain(){ cin>>n; for(inti=1;i<=n;i++)cin>>h[i]; memset(dp,0x3f,sizeof(dp)); dp[1]=0; for(inti=1;i<......