zoj 4130(The 16th Zhejiang Provincial Collegiate Programming Contest D)(思维)

news/2024/11/2 2:26:14/

传送门:

题意:

你现在有nnn个点,对于第iii个点,可以到达第i−1i-1i12∗i2*i2i2∗(i+1)2*(i+1)2(i+1)⌊i2⌋\left \lfloor \frac{i}{2} \right \rfloor2i号点。现在问你从111号点开始的哈密顿路径。

分析:

一道非常有意思的题目。

我们需要发掘题目中隐藏的信息。

首先,假设该顶点不能到达第i−1i-1i1个结点,对于任意一个点iii,因为它能够到达第2∗i2*i2i2∗(i+1)2*(i+1)2(i+1)以及⌊i2⌋\left \lfloor \frac{i}{2} \right \rfloor2i,因此,由这些点所形成的结点必然能够形成一棵完全二叉树

显然一颗树是不能形成哈密顿回路的,显然这题的重中之重就是如何怎么选择去到第i−1i-1i1个结点。

现在,如果加上到第i−1i-1i1号结点的边,那么这张图将会变成这样:
在这里插入图片描述
而对于某一个结点iii,如果我们一直遍历2∗i2*i2i2∗(i+1)2*(i+1)2(i+1)号结点,那么答案显然不会变优,因此我们需要在遍历图的过程中优先选择往i−1i-1i1号结点访问,倘若i−1i-1i1号结点被访问过了,则再访问第2∗i2*i2i号点。

这样进行dfs遍历之后,我们会发现我们形成了这样一棵dfs树:

在这里插入图片描述
这棵dfs树所表示的即为遍历所有结点的顺序。此时我们只需要对这棵dfs树先遍历右儿子再遍历左儿子并把整张图输出即可。

需要注意的是,我们需要在遍历每一个点的时候判断一下当前点的第2∗(i+1)2*(i+1)2(i+1)号结点是否曾经在第一次dfs中访问,如果没有,则需要在此时输出。

代码:

#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
typedef pair<int,int>pll;
pll q[maxn];
bool vis[maxn];
int n;
bool check(int x){return x>=1&&x<=n&&!vis[x];
}
void dfs(int x){vis[x]=true;if(check(x-1)){q[x].first=x-1;dfs(x-1);}if(check(x<<1)){q[x].second=x<<1;dfs(x<<1);}
}
void dfs2(int x){if(x==1) printf("1");else printf(" %d",x);if(check(x<<1|1)){vis[x<<1|1]=1;printf(" %d",x<<1|1);}if(q[x].second!=0){dfs2(q[x].second);}if(q[x].first!=0) dfs2(q[x].first);
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=n;i++) vis[i]=false,q[i].first=q[i].second=0;dfs(1);dfs2(1);puts("");}return 0;
}

转载于:https://www.cnblogs.com/Chen-Jr/p/11007142.html


http://www.ppmy.cn/news/221951.html

相关文章

ZOJ -4130 Turn It Off

题目描述&#xff1a; Its already 21:30 now, and its time for BaoBao to go to bed. To ensure his sleeping quality, BaoBao decides to turn all the lights in his bedroom off. There are n lights, numbered from 1 to n, arranged in a row in BaoBaos bedroom. Ea…

“同档位无对手”的荣耀90系列,有哪些厉害的能力?

5 月 29 日&#xff0c;荣耀90系列正式发布。该系列包括荣耀90 Pro与荣耀90两款机型。 这两款机型都有哪些厉害的能力&#xff1f; 一、赵明&#xff1a;荣耀90系列“同档位无对手” 发布会在天府之国的成都市举行&#xff0c;这个以时尚和美食著称的城市&#xff0c;近年来…

P4130或JZOJ 1214. 【NOI2007】项链工厂

D e s c r i p t i o n Description Description 写一种数据结构&#xff0c;支持区间染色&#xff0c;区间翻转&#xff0c;区间旋转&#xff0c;区间查询颜色&#xff0c;单点修改颜色 对 于 100 % 的 数 据 &#xff0c; N ≤ 500000 &#xff0c; Q ≤ 500000 &#xff0…

P4130,jzoj1214-[NOI2007]项链工厂【线段树】

正题 题目链接:https://www.luogu.org/problemnew/show/P4130 题目大意 一个环形颜色珠子链&#xff0c;位置(注意不是上面的珠子)从最上顺时针下来位置依次标号 1 ∼ n 1\sim n 1∼n。 然后要求支持以下操作 R k : R\ k: R k:将所有珠子顺时针旋转 k k k个。 F : F: F:将所…

intel 从CPU上怎么看几代

比如现在的处理器&#xff0c;i系列&#xff0c;i3&#xff0c;i5&#xff0c;或i7&#xff0c;用i3举例&#xff0c;第一代是i3 1530&#xff0c;这里把1代省了&#xff0c;所以是i3 530。二代比如i3 2100&#xff0c;三代i3 3220&#xff0c;四代i3 4130&#xff0c;就是从i3…

图解LeetCode——114. 二叉树展开为链表

一、题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 二…

PDF怎么转换成WORD?分享这几个方法给大家!

PDF怎么转换成Word&#xff1f;在我们的工作过程中&#xff0c;经常会使用到PDF文件、Word文件等等。而在很多时候&#xff0c;需要根据工作需求&#xff0c;将各种文件进行格式转换&#xff0c;例如将PDF文件转换成Word格式&#xff0c;从而满足我们对文件进行编辑、更改等需求…

3.完成ODS层数据采集操作

将原始数据导入mysql 1 选中mysql 运行脚本 2 验证结果 数据存储格式和压缩方案 存储格式 分类 1.行式存储(textFile) 缺点:可读性较好 执行 select * 效率比较高 缺点:耗费磁盘资源 执行 select 字段 效率比较低 2.列式存储(orc) 优点:节省磁盘空间. 执行 select 字段…