当前位置: 首页 > news >正文

P4583 [FJOI2015] 世界树 - Link

题意

要求构建一个 \(n\) 个节点的二叉树,其中叶子结点被称为“源”,要求每个节点的左右子树中最深的叶子节点深度相差不超过 \(1\),问两个叶子结点深度差的最大值,\(T\) 组询问。
\(n\le10^{10000},T\le50\)

思路

令根节点深度为 \(1\)
\(f_i\) 表示最深的“源”深度为 \(i\) 的“源”最少所需的节点数。\(f_i=f_{i-1}+f_{i-2}+1\),即新增一个根结点,左子树方深度为 \(i-1\) 的“源”,右子树放深度为 \(i-2\) 的“源”,此时最浅“源”的深度为 \(\lceil\frac{i+1}2\rceil\)
对于 \(n\),找到最大的 \(i\) 满足 \(f_i\le n\),答案即位 \(i-\lceil\frac{i+1}2\rceil\)
但是这样只能拿 \(90\) 分,因为当 \(n=6\) 时,这个算法会算出 \(1\),但是答案为 \(0\)。特判掉就能 \(AC\) 了。

代码

由于这个题目非常恶心,需要把询问离线下来,用滚动的方式递推,不然会 \(MLE\),还需要压位高精度,不然会 \(TLE\)

/*
Luogu P4583 [FJOI2015] 世界树
2026-04-14
*/
#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>inline void read(T&x){x=0;char c=getchar();bool f=0;while(!isdigit(c)) c=='-'?f=1:0,c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();f?x=-x:0;}template<typename T>inline void write(T x){if(x==0){putchar('0');return ;}x<0?x=-x,putchar('-'):0;short st[50],top=0;while(x) st[++top]=x%10,x/=10;while(top) putchar(st[top--]+'0');}inline void read(char&c){c=getchar();while(isspace(c)) c=getchar();}inline void write(char c){putchar(c);}inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}template<typename T,typename...T2> inline void read(T&x,T2&...y){read(x),read(y...);}template<typename T,typename...T2> inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
struct Int{vector<int>a;friend void write(Int x){if(x.a.size()==0){write(0);return ;}for(int i=x.a.size()-1;i>=0;i--) write(x.a[i]);}friend void read(Int&x){x.a.clear();string s;read(s);int be=0;while(be<s.size()&&s[be]=='0') be++;if(be==s.size()){x.a.push_back(0);return;}s=s.substr(be);int len=s.size();for(int i=len;i>0;i-=8){int ls=0;for(int j=max(0,i-8);j<i;j++) ls=ls*10+(s[j]-'0');x.a.push_back(ls);}}Int(int x){while(x) a.push_back(x%100000000),x/=100000000;}Int(){a.clear();}void clear(){a.clear();}Int operator+(const Int&x)const{vector<int>b=x.a,a=this->a;int n=max(b.size(),a.size());b.resize(n+1),a.resize(n+1);for(int i=0;i<n;i++) a[i]+=b[i];for(int i=0;i<n;i++) a[i+1]+=a[i]/100000000,a[i]%=100000000;while(!a.empty()&&!a.back()) a.pop_back();Int A;A.a.swap(a);return{A};}bool operator<=(const Int&x)const{if(a.size()<x.a.size()) return 1;if(a.size()>x.a.size()) return 0;for(int i=a.size()-1;i>=0;i--) if(a[i]<x.a[i]) return 1;else if(a[i]>x.a[i]) return 0;return 1;}
};
Int n,a,b;
int cnt,ans[100];
struct que{Int n;int id;bool operator<(const que&t){return n<=t.n;} 
}q[100];
void solve(){read(n);cnt++;q[cnt]={n,cnt};
}
signed main(){int T;read(T);for(int i=1;i<=T;i++) solve();sort(q+1,q+1+T);a=1,b=2;int w=1;for(int i=1;;i++){while(q[w].n<=b){ans[q[w].id]=i-ceil((i+1)/2.0);w++;if(w>T) break;}if(w>T) break;a=a+b;swap(a,b);b=b+1;}for(int i=1;i<=T;i++) if(q[i].n<=6&&(Int)6<=q[i].n) ans[q[i].id]=0;for(int i=1;i<=T;i++) write(ans[i]),write("\n");return 0;
}
http://www.jsqmd.com/news/652163/

相关文章:

  • Ubuntu20.04部署XTDrone避坑实践指南
  • DS4Windows陀螺仪精准调校实战方案:彻底解决手柄漂移问题
  • 告别虚拟机!在Win11上用Docker Desktop 5分钟搞定Nginx本地测试环境
  • 放弃Keil自带的Pack Installer吧!手把手教你离线安装STM32G0芯片支持包(以STM32G0xx_DFP为例)
  • 兰亭妙微:信息过载时代,争夺用户注意力为何是未来设计的必然趋势 - ui设计公司兰亭妙微
  • 受益者思维的庖丁解牛
  • 从LED驱动到电机控制:单片机I/O口阻抗的5个实战应用技巧
  • LVS负载均衡集群理论详解
  • 华三交换机通过CONSOLE访问配置
  • 用Modbus Poll调试你的STM32 Modbus设备:从连接配置到数据帧分析全流程
  • TypeScript + React 实现 WELearn 网课助手:300%学习效率提升的完整技术实现方案
  • JavaScript中isFinite/isNaN与Number.isFinite/Number.isNaN的区别
  • 5步实现B站视频内容数字化:高效提取视频信息的最佳工具
  • 避开这些坑!在物理机/KVM上部署华为FusionAccess 6.5.1的完整网络规划与虚拟机创建指南
  • 如何快速获取2000+免费生物科学矢量图标:Bioicons完整指南
  • 从工程伦理期末考看职场:工程师如何在实际项目中避开那些“送命题”?
  • 银河麒麟Server V10 SP1系统下Python2环境配置:从setuptools到pip2的完整指南
  • AD9361接收链路调试踩坑记:从官方配置软件到LVDS数据捕获的完整流程
  • 如何用Blender3mfFormat插件完美处理3MF文件:从导入到导出的完整指南
  • vscode remote ssh远程连接报错“VS Code 服务器启动失败”可能的解决方案
  • 如何高效构建个人离线学习库:MoocDownloader实用指南
  • 把Spark-TTS语音克隆塞进你的Python项目:一个FastAPI接口的完整封装与优化实践
  • 2025全网盘下载加速神器:LinkSwift 直链下载助手完全指南
  • 增强现实应用:图像识别与三维注册的技术
  • 3步解决Zotero中文文献识别难题:茉莉花插件完全指南
  • PUBG罗技鼠标宏压枪脚本终极指南:智能后坐力控制技术深度解析
  • App Inventor 2拓展开发避坑指南:Windows下Ant打包失败、源码下载慢的终极解决方案
  • 告别内核态:用FD.io VPP在用户空间打造高性能虚拟路由器的保姆级指南
  • 为什么90%的情感AI项目死在第3个月?2026奇点大会首席架构师亲授“情感可用性(EA)五阶验证法”,含可下载Checklist
  • MogFace-large商业应用探索:零售客流量统计中的人脸检测方案