首页 > 编程语言 >abc290g O(TD)算法

abc290g O(TD)算法

时间:2023-11-23 15:56:44浏览次数:30  
标签:子树 num1 val -- LL 算法 num abc290g TD

前言

似乎洛谷上的题解和AT官方都给的 \(O(TD^2)\) 算法?

这里给出乱搞搞出的一种 \(O(TD)\) 算法。

题解

首先发现 \(D\) 虽然没给出固定上界,但显然不超过 \(log_2 10^{18}=60\)。

再接下来可以发现删边等价于先选一颗子树,再删掉这颗子树内部的子树。

先纸上瞎画两下,发现子树内部全保留或全删除一定比有些保留有些删除优。

因此我们先猜测答案一定是非常左偏的,例如这样。

(图中外框深色的即为被选中的)

所以我们可以胡出一种看起来很对的做法:预处理所有深度子树的大小,找到比要求节点数大的最深子树,然后在上面拆。

但是很显然这个结论是不对的那你讲它干嘛

考虑对于这种构造方案的hack,一颗深度是4的满二叉树,选5个点。

选择方案显然并不是选子树,因为到根节点可以少掉整颗树根往上的边,因此先选一条从根到底部的路径,再选子树更优。

因此我们对这两种情况分讨取 \(\min\) 即可。

时间复杂度 \(O(TD)\),所有的点都可以在 1ms 内通过。

Code

#include <bits/stdc++.h>
using namespace std;
#define LL long long
LL n,i,j,k,m,t;
LL val[1005];
int main() {
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld%lld",&m,&n,&k);
		LL sum=1;
		memset(val,0,sizeof(val));
		val[0]=1;
		for(i=1;i<=m;i++){
			sum*=n;
			val[i]=val[i-1]+sum;
		}
		bool flag=false;
		for(i=m;i>=0;i--)
		  if(k==val[i]){
		  	flag=true;
		  	if(i==m) printf("0\n"); 
		  	else printf("1\n");
		  	break;
		  }
		if(flag==true) continue;
		LL ans=0,tmp=0,num=k;
		for(i=m;i>=0;i--)
		  if(k/val[i]>0){
		  	tmp=i;
		  	break;
		  }
		k--;
		if(tmp!=m-1)ans++;
		for(i=tmp;i>=0;i--){
			LL num1=k/val[i];
			k-=num1*1ll*val[i];
			ans+=(n-num1-1);
			if(k==0){
				ans++;
				break;
			}
			else k--;
		}
		if(num-(m-tmp)<=val[tmp]) tmp--;
		if(tmp<0){
			printf("%lld\n",ans);
			continue;
		}
		num-=(m-tmp);
		LL ans1=(n-1)*(m-tmp-1);
		for(i=tmp;i>=0;i--){
			LL num1=num/val[i];
			num-=num1*1ll*val[i];
			ans1+=(n-num1-1);
			if(num==0){
				ans1++;
				break;
			}
			else num--;
		} 
		printf("%lld\n",min(ans,ans1));
	}
	return 0;
}

标签:子树,num1,val,--,LL,算法,num,abc290g,TD
From: https://www.cnblogs.com/monster-hunter/p/17851738.html

相关文章

  • java把数据批量插入iotdb
    packagecom.xlkh.kafka;importcn.hutool.core.collection.CollectionUtil;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONArray;importcom.google.common.collect.Lists;importcom.google.common.collect.Sets;importlombok.SneakyThrows;i......
  • 子元素div如何占满整个td标签
    答:两种思路。思路一、放弃表格自带的自适应功能,也就是内容不会自动垂直居中,高度也不会由内容伸展。将div相对td绝对定位,div的边缘都紧贴td的边缘。td{position:relative;}div{position:abolsute;top:0;right:0;bottom:0;left:0;}思路二......
  • 记录 Linux zstd测试程序
    系统版本[root@localhost~]#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)1.linux命令行环境下如何从github上获取源代码直接gitclone项目的github地址(http开头),如gitclone https://github.com/facebook/zstd.git 2.Linux安装cmake3.......
  • 算法概念
    算法的定义:解决问题的过程中用到的所有方法和步骤。算法的描述方法:自然语言、流程图、计算机语言。算法的三大结构:顺序结构、选择结构、循环结构。算法的特点:1、有穷性。(算法的操作步骤应是有限的。生活算法与程序算法都是有穷的,没有永远完不成任务的生活算法。)......
  • Dijkstra 算法python版
    算法策略Dijkstra算法是求一个图中一个点到其他所有点的最短路径的算法,先了解图的数据结构「邻接矩阵」Dijkstra算法是一个基于「贪心」、「广度优先搜索」、「动态规划」求一个图中一个点到其他所有点的最短路径的算法,时间复杂度O(n2)B站视频:https://www.bilibili.com/vide......
  • CART算法解密:从原理到Python实现
    本文深入探讨了CART(分类与回归树)算法的核心原理、实现方法以及应用场景。文章首先介绍了决策树的基础知识,然后详细解析了CART算法的工作机制,包括特征选择和树的构建。接着,通过Python和PyTorch的实例代码展示了CART算法在实际问题中的应用。最后,文章评价了该算法的优缺点,并讨论了......
  • 基于googlenet网络的动物种类识别算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述       动物种类识别算法基于深度学习技术,尤其是卷积神经网络(CNN),如GoogleNet。这种算法的主要原理是通过学习和识别图像中的特征来预测动物的种类。        GoogleNet,也被......
  • 基于大规模MIMO通信系统的半盲信道估计算法matlab性能仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述      基于大规模MIMO通信系统的半盲信道估计算法涉及多个步骤,其原理和数学公式概括如下:        首先,MIMO系统需要发送已知的训练序列,在接收端进行初始的信道估计。当发送......
  • 算法学习笔记(41): 朴素多项式算法
    朴素多项式算法-\(O(n^2)\)合集我们并不需要NTT,就算需要,也只是用来优化乘法。多项式求逆对于多项式\(\suma_ix^i\)我们需要构造出一个多项式\(\sumb_ix^i\)使得:\[\begin{cases}a_0b_0=1\\\sum_{i=0}^ka_ib_{k-i}=0&k\ge1\end{cases}\]首先\(......
  • JVM学习记录三(垃圾回收器之标记法及回收算法)
    先了解为什么样的垃圾会被回收,哪里的垃圾回收的是堆内垃圾,当对象没有任何引用指向,那就是垃圾,就有可能被回收回去怎么定位是可需要被回收的垃圾引用计数法:当对象被引用一次那就增加一个一个引用次数,如果未被引用过,则引用次数为0,不过可能会存在循环引用,出现内存泄露的问题可达性计数......