Atcoder AGC050A AtCoder Jumper 题解 [ 紫 ] [ 构造 ] [ adhoc ] [ 二叉树 ]
Atcoder Jumper:人类智慧题。
观察
首先观察到
倍增想了想发现是不可行的,因为一个点最多拓展到另外两个点,并且倍增构造的话永远只能跳到
而根据一个点最多拓展到另外两个点,我们可以很自然地想到类似线段树的一个结构,即二叉树结构。
至此都很容易想到,我们以
构造
我们考虑一个构造常用的思路,那就是把他归纳到原来的情况去,不难发现,从叶子结点出发,按照二叉树构造,且不限制深度的话,同样能到达另外
具体的,我们可以将
为啥这个可以实现重新分配呢?因为在不考虑深度限制的情况下叶子结点
直接构造即可,时间复杂度
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
int n;
int main()
{
//freopen("sample.in","r",stdin);
//freopen("sample.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
int ls=(i<<1)%n,rs=((i<<1)|1)%n;
if(ls==0)ls=n;
if(rs==0)rs=n;
cout<<ls<<" "<<rs<<'\n';
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战