首页 > 其他分享 >2024牛客多校第四场F.Good Tree 挑战全网最详解

2024牛客多校第四场F.Good Tree 挑战全网最详解

时间:2024-07-28 17:41:02浏览次数:11  
标签:... Good 一个点 子树里 Tree 贡献 子树 第四场 2K

好吧标题党了一回,但我相信有不少人被出题人的那句“手玩一下就知道了”无语住了

像我这种憨憨一旦想偏了就救不回来了,于是困惑了好久,在雨巨的指导下彻底搞懂

(此处大声谢谢雨巨,又有实力又会讲题又认真答疑每一个问题,呜呜呜我永远的姐)

题意简单来说就是定义f(i)为树上i点到其他所有点的距离之和,给定x,要求构造一棵树使得存在点u,v满足f(v)-f(v)=x,且所用的节点最少。

不妨把树上AB所在的路径拉出来,假设A子树里还有其他点,B子树里还有其他点

我们发现AB之间的点,因为有对称性,对A和B的贡献都是一样的

但是A子树中的点就不一定了,A到B一共要走4条边,A中有3个点,走到A的总贡献是3*1=3,走到B的总贡献是(1+4)*3=15

多了的12其实就是A子树中的点数*AB链上的边数=3*4=12

B子树同理,多了的部分是2*4=8

且在f(A)-f(B)中,A子树中的贡献是负值,也就是-12,B子树中的贡献是正值,也就是+8。

 

现在希望考虑极限情况,钦定f(A)的值能取到最大

 这时A的子树为空是最好的,因为它们只能贡献负数,那么就变成了:

 不妨设A到B的路径上共经过了P个点,则B的子树里有N-P-1个点,对f(A)-f(B)能产生的贡献一共是P*(N-P-1)

根据均值不等式,和一定时两数乘积要最大,必然要两数尽量相等,即P=N-P-1,P=(N-1)/2

当N-1=2k时,也就是N为奇数时,P值即为k

f(A)-f(B)取到极值K*K

当N-1=2k+1时,也就是N为偶数时,P值为k+1,B子树里有k个

 

f(A)-f(B)取到极值(K+1)*K

至此我们有结论一:

输入为K^2时,答案为2K+1,输入为K*(K+1)时,答案为2K+2,输入为(K+1)*(K+1)时,答案为2(K+1)+1=2K+3

而在这之间,由于答案具有单调性,且每个点我们都取到了最大值,[K*K+1,K*K+K-1]肯定是比2K+1大的

 现在到了最麻烦的部分,证明:

① 在输入为[K*K+K+1,(K+1)^2)时,证明2K+3能覆盖到所有值

先考虑取到K*K+K,只要在原来K*K的基础上在B的子树里再接一个点就能+K

接下来的事情就有趣了

首先怎么整+1?

发现如果A到B(不包含B)的个数为奇数的话,只要取中间且尽量靠B的点就能+1

因为奇数总是可以拆成k+1,k的和的形式,只要让A得到的贡献是k+1,必然比B多1

那怎么整+3?

发现在链上加点能+1,+3,+5...

这样就在原来2K+1的基础上再加两个点(一个在子树内,一个在路径上)得到了[K*K+K+1,(K+1)^2)里一半的值,下图是k=5时的例子

那怎么整+2?

发现如果最开始凑K的那个点一直留在B的子树内的话,怎么加都是1,3,5,没法得到2,4,6

这是因为在AB路径上每多走一条边,对A是+1,对B是-1,贡献的变化肯定是偶数

所以我们发挥人类智慧把这个点拉到链上,这也是让贡献+K

 

 

 

发现取中间加点贡献为0,往右边挪一个贡献+2,再往右一个+4...

这样就取到了另外一半的值。

当k=偶数时同理,至此我们证明了当输入在[K*K+K+1,(K+1)^2),2k+3能覆盖所有值。

②那么用2k+2能否取遍[K*K+1,K*K+K) ?

这次因为不需要先凑出K,我们先只考虑多出来的一个点放哪。

当K为奇数时,根据上面的推理,从中间往B加依次能得到+1,+3,...的贡献

当K为偶数时,依次能得到+2,+4,...的贡献

也就是说如果x-K*K(这里x是输入的)和K同余的话,一定能只用一个点凑到。

 如果不同余呢?

这时只加一个点无论如何是不够的,不管怎么调整(加在子树上无解,路上上无解,调整子树大小还会变小),一定至少需要2个点。

现在证明2个点一定能凑出来:

如果K是奇数:原本加一个点只能+1,+3,多了一个点后+2可以通过在+1的地方加两个点,用1+1凑,4可以用1和3凑,6可以用1和5凑...

如果K是偶数:原本只能+2,+1怎么凑?先把子树中的一个点拎到链上,答案就从K*K变成(K+1)*(K-1)=K*K-1

接下来手上有两个点了,能凑出1+1=2,1+3=4......加上K*K-1就能依次得到K*K+1,K*K+3......

至此我们证完了结论②。

整理一下结论:

附上队友写的代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int T,x;
int sol(){
    cin >> x;
    int n=sqrt(x);
    while (n*n>x) n--; 
    //printf("n=%lld\n",n);
    if (n*n==x) return 2*n+1;
    if (n*n+n>=x){
        if ((n*n+n-x)%2) return 2*n+3;
        return 2*n+2;
    }
    else{
        return 2*n+3;
    }
}
void test(){
    for (int i=1;i<=10;i++){
        x=i;
        printf("%lld:%lld\n",i,sol());
    }
}
signed main(){
//    test();
    cin >> T;
    while(T--) cout << sol() << endl;
    return 0;
}

 

标签:...,Good,一个点,子树里,Tree,贡献,子树,第四场,2K
From: https://www.cnblogs.com/liyishui2003/p/18328416

相关文章

  • 【linux】【设备树】具有 GPIO 控制器和连接器的硬件配置的备树(Device Tree)代码讲解
    具有GPIO控制器和连接器的硬件配置的备树(DeviceTree)代码讲解背景-学习Linux设备树代码soc{soc_gpio1:gpio-controller1{#gpio-cells=<2>;};soc_gpio2:gpio-controller2{#gpio-cells=<2>;};};connector:connect......
  • CF1060F Shrinking Tree
    考虑分别以每个点为根计算概率,可以计算所有边固定了收缩顺序的概率之和后除以\((n-1)!\)即为答案设\(f_{x,i}\)表示在\(x\)的子树内,删除最后\(i\)条边前后根的编号不发生变化的概率和,所求即为\(f_{rt,n-1}\)记当前点为\(v\),父节点为\(u\),因为收缩\((u,v)\)时,之前的......
  • lxml.etree 元素在副本上删除命名空间
    我正在使用lxml.etree库将XML文件拼接在一起,并且命名空间在写入时被删除。Input.xml<?xmlversion="1.0"encoding="UTF-8"?><haul><uuid>abc</uuid><portxmlns="hello"xmlns:a="hello">......
  • Fenwick Tree
    看这篇题解解释一下是为什么看蓝书的图,比如\(a_3\)对\(c_8\)的贡献,操作一次,贡献系数为\(1\),然后将\(a_8\)中\(a_3\)的贡献次数改为\(1\),考虑一下操作第二次在干什么,我们是先更新了\(a_3\)对\(c_4\)的贡献,然后让\(c_8\)为\(c_4\)和\(a_8\)(注意这里的\(a_8\)已经不是最开始的\(a_8......
  • MySQL索引详解full-text,b-tree,hash,r-tree
    一、MySQL索引类型mysql里目前只支持4种索引分别是:full-text,b-tree,hash,r-treeb-tree索引应该是mysql里最广泛的索引的了,除了archive基本所有的存储引擎都支持它.1.full-text索引full-text在mysql里仅有myisam支持它,而且支持full-text的字段只有char、varchar、text数据类型......
  • 使用 ElementTree 库解析 KML/XML
    我想利用ElementTreepython库解析SimpleData标签中找到的“ID2”名称属性。<Placemark><ExtendedData><SchemaData><SimpleDataname="ID1">123456</SimpleData><SimpleDataname="ID2">......
  • 索引结构—B+Tree索引、Hash索引、Full-Text(全文)索引、R-Tree(空间)索引
    一、概述在数据库系统中,索引是一种用于加快数据检索的数据结构。不同的索引结构适用于不同的查询场景和数据特性。索引按照不同角度可以划分不同类型的索引。按照数据结构可以划分B+Tree索引、Hash索引、FULLTEXT(全文)索引、R-Tree(空间)索引二、索引结构mysql的索引是作用于......
  • xml.etree.ElementTree 文档中文翻译; SVG矢量图;Python标准库
    更新中..简介xml.etree.ElementTree实现了一个简洁有效的用于解析和新建XML数据的API。其也被简称为ET。弃用:xml.etree.cElementTree自Python==3.3已被弃用警告:使用时需注意恶意构建的数据,请防范XML漏洞概念XML是一种继承性的分层数据格式,常用树来表示。ET有两个类,Ele......
  • QTreeView 样式设置以及Checkbox复选框样式设置
    这种样式设置如下QTreeView{background:#303033;font-size:16px;color:rgba(255,255,255,1);border:0px;}QTreeView::item{background:#303033;height:40px;}QTreeView::branch{background:#303033;}QTreeView::item:hover{......
  • Jax 抖动 kd-tree 代码需要花费相当长的时间
    我已经把自己陷入了以下情况的困境:我正在运行一个需要平滑渐变才能工作的优化器,并且我正在使用Jax进行自动微分。由于此代码是Jaxjitted,这意味着连接到它的任何内容都必须是Jaxjit可追踪的。我需要插入一个函数以与优化器一起使用,但不能使用Scipy库,因为它......