题目传送门

题目大意:

  从0出发,每次只能跳到(i*2)%n或者(i*2+1)%n,求字典序最大的哈密顿回路。

思路:

  首先n为奇数时无解,先来证明这一点。

  先假设n为奇数,若要回到原点,则必定有一步是$a%n=0$,则$a=kn(k为整数)$。

  我们先假设a是通过$2x$的方式得到的,即$kn=2*x$,由于此时$n$为奇数,则k必定为偶数,由于$n>x$,所以$k<2$,k又不能等于0,所以此时k无解,a不是通过$s*x$的方法得到的

  那么$kn=2*x+1$,k为奇数,则$k=1  ,a=n=2*x+1$,也就是说,我们从x出发的这一步,是走到0的位置的,那么$2*x$这一步,就没有点是走到这里来的了,而$2*x=n-1$,又是我们必须到达的点,所以这种方法也无解。

  那么我们的假设错误,n必须是偶数。

  在偶数的情况下,我们发现$i$和$i+n/2$的出边相同。 我们把i和i+n/2看成一个点,现在就是一张n/2个点的图,所有点都有两条入边和两条出边,满足欧拉回路每个点度数都为偶数的性质! 于是只需要跑出欧拉回路就能对应到原问题了,介于欧拉回路算法的性质,贪心走较大的边即可保证字典序最大。(后面这一半是抄的官方题解)

  对于欧拉回路dfs过程,我们只要倒序输出,得到的就还是我们需要的字典序最大的回路。

#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
const int maxn=;
int n,vis[maxn],q[maxn],cnt;
void dfs(int u){ if(!vis[(u<<|)]){
vis[(u<<|)]=;
dfs((u<<|)%(n>>));
q[++cnt]=(u<<|)%n;
}
if(!vis[(u<<)]){
vis[(u<<)]=;
dfs((u<<)%(n>>));
q[++cnt]=(u<<)%n;
}
}
int main(){
while(cin>>n)
{
cnt=;
clr(vis,);
if(n%==){
puts("-1");
continue;
}
q[++cnt]=;
vis[]=;
dfs();
printf("");
while(cnt){
printf(" %d",q[cnt--]);
}
puts("");
}
return ;
}

Little Sub and Traveling(杭师大第十二届校赛E题) 欧拉回路的更多相关文章

  1. Little Sub and Piggybank (杭师大第十二届校赛G题) DP

    题目传送门 题意:每天能往存钱罐加任意实数的钱,每天不能多于起那一天放的钱数.如果某一天的钱数恰好等于那天的特价商品,则可以买,求最后的最大快乐值. 思路:先来一段来自出题人的题解: 显然的贪心:如果 ...

  2. HZNU第十二届校赛赛后补题

    愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...

  3. 台州学院第十二届校赛记录(B,C,E,H,I,J,L)

    传送门:点我 题目很棒,感谢出题验题的大佬们. 细节坑不少,是好事. 还是很菜,继续加油! B: 桃子的生日 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KBy ...

  4. 湖南省第十二届省赛:Parenthesis

    Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q questions. The i-t ...

  5. 福州大学第十届校赛 & fzu 2128最长子串

    思路: 对于每个子串,求出 母串中 所有该子串 的 开始和结束位置,保存在 mark数组中,求完所有子串后,对mark数组按 结束位置排序,然后 用后一个的结束位置 减去 前一个的 开始 位置 再 减 ...

  6. 第十二届湖南省赛G - Parenthesis (树状数组维护)

    Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of length n and q questions. The i-th questio ...

  7. 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题

    Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...

  8. 第十二届湖南省赛 A - 2016 ( 数学,同余转换)

    给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:       1. 1≤a≤n,1≤b≤m;   2. a×b 是 2016 的倍数.   Input   输入包含不超过 30 ...

  9. 浙江省第十二届省赛 Beauty of Array(思维题)

    Description Edward has an array A with N integers. He defines the beauty of an array as the summatio ...

随机推荐

  1. 清北学堂 day6 花

    1.花( flower.cpp/c/pas)[ 问题描述]商店里出售 n 种不同品种的花.为了装饰桌面,你打算买 m 支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买 1 支.求总共有几种 ...

  2. 一些命令可以帮您了解Linux 操作系统用户信息

    1 显示上次登录的用户信息列表,包括(登录时间.退出时间.登录IP): [sywu@wusuyuan ~]$ last root pts/1 192.168.1.3 Wed Aug 27 22:08 ...

  3. sqlserver 2005范例代码查询辞典文摘

    第1章 select 1.显示指定想要获取的列要比使用select *更好 2.where not m.MemberCode = 1000 3.select * into aaa from Membe ...

  4. Leaflet入门:添加点线面并导入GeoJSON数据|Tutorial of Leaflet: Adding Points, Lines, Polygons and Import GeoJSON File

    Web GIS系列: 1.搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 2.使用GeoServer+QGIS发布WMTS服务 3.使 ...

  5. C# 生成dll文件 并导入使用

    首先 在unity创建一个脚本 并编写内容,其中需要调用的方法.变量要公有化(也可以直接新建cs文件用编译器打开编译,但要先导入UnityEngine.dll). 然后,复制脚本关闭unity,在外界 ...

  6. Ubuntu重复循环启动的快速解决方法

    如果因为在配置java或者adb环境变量时修改profile文件导致的在登录界面输入密码后重复循环启动的问题,下面总结网上和实践找到快速解决的方法啦! 1.在登录界面按下ctrl+alt+F1进入命令 ...

  7. SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)(Finchley版本)

    在上一篇文章讲述zuul的时候,已经提到过,使用配置服务来保存各个服务的配置文件.它就是Spring Cloud Config. 一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管 ...

  8. error: field 'b' has imcomplete type

    在下面的程序中,在编译时会遇到下面的错误: error: field 'b' has incomplete type 域b是一个不完备的类型,即class B的声明不完备 #include <i ...

  9. C# 利用CMD命令行结束进程

    public static void CmdKillProcess(int pid)        {            string cmdStr = string.Format("t ...

  10. Intel Galileo development documentation

    Intel Galileo development Documentation Author:Liutianchen 1552227, Department of Computer Science,E ...