Little Sub and Traveling(杭师大第十二届校赛E题) 欧拉回路

题目传送门

题目大意:

  从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=20010;
int n,vis[maxn],q[maxn],cnt;
void dfs(int u){

    if(!vis[(u<<1|1)]){
        vis[(u<<1|1)]=1;
        dfs((u<<1|1)%(n>>1));
        q[++cnt]=(u<<1|1)%n;
    }
    if(!vis[(u<<1)]){
        vis[(u<<1)]=1;
        dfs((u<<1)%(n>>1));
        q[++cnt]=(u<<1)%n;
    }
}
int main(){
    while(cin>>n)
    {
        cnt=0;
        clr(vis,0);
        if(n%2==1){
            puts("-1");
            continue;
        }
        q[++cnt]=0;
        vis[0]=1;
        dfs(0);
        printf("0");
        while(cnt){
            printf(" %d",q[cnt--]);
        }
        puts("");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/mountaink/p/10562430.html

时间: 2024-10-07 14:45:44

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

[第十届校赛]简单总结

这次校赛其实是抱着比较大的期望来打的,首先我是单挑,好像自从去年蓝桥杯后就没有一个人做过比赛,一般都是组队做,这次单挑,是想测测自己的水平和对节奏的把握,也有夺冠的冲动,很可惜,整体上是失败了TAT.如果一开始就稳扎稳打,说不定真的可以题数碾压.. 做完胡老师出的三个水题后,交了一发卡精度的二分,节奏就开始乱了.首先我自认为我的思路很正确,并且已经将误差降到很低了,但陆陆续续wa了7发,wa的原因自然是精度问题.大概比赛结束前2个小时,我把精度加大了一位,居然奇迹般的过了,无语..我一直以为比目

浙江省第十二届省赛 Beauty of Array

Description Edward has an array A with N integers. He defines the beauty of an array as the summation of all distinct integers in the array. Now Edward wants to know the summation of the beauty of all contiguous subarray of the array A. Input There a

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

给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input 输入包含不超过 30 组数据. 每组数据包含两个整数 n,m (1≤n,m≤10 9). Output对于每组数据,输出一个整数表示满足条件的数量.Sample Input 32 63 2016 2016 1000000000 1000000000 Sample Output 1 30576 7523146895502644 Hint 思路:

hdoj 1290 献给杭电五十周年校庆的礼物 【几何模板】

献给杭电五十周年校庆的礼物 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7597    Accepted Submission(s): 4145 Problem Description 或许你曾经牢骚满腹 或许你依然心怀忧伤 或许你近在咫尺 或许你我天各一方 对于每一个学子 母校 永远航行在 生命的海洋 今年是我们杭电建校五十周年,

hdu 1290 献给杭电五十周年校庆的礼物

献给杭电五十周年校庆的礼物 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7236    Accepted Submission(s): 3936 Problem Description 或许你曾经牢骚满腹 或许你依然心怀忧伤 或许你近在咫尺 或许你我天各一方 对于每一个学子 母校 永远航行在 生命的海洋 今年是我们杭电建校五十周年,

献给杭电五十周年校庆的礼物

献给杭电五十周年校庆的礼物 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7897 Accepted Submission(s): 4325 Problem Description 或许你曾经牢骚满腹 或许你依然心怀忧伤 或许你近在咫尺 或许你我天各一方 对于每一个学子 母校 永远航行在 生命的海洋 今年是我们杭电建校五十周年,这是一个值得

第十二届全国人民代表大会《政府工作报告》全文

第十二届全国人民代表大会<政府工作报告>全文 第十二届全国人民代表大会<政府工作报告>全文 温jia宝 2013年3月5日 温jia宝: 现在,我代表国务院,向大会报告过去五年的政府工作,并对今年工作提出建议,请各位代表审议,并请全国政协委员提出意见.[09:05] 过去五年工作回顾[09:06] 第十一届全国人民代表大会第一次会议以来的五年,是我国发展进程中极不平凡的五年.我们有效应对国际金融危机的严重冲击,保持经济平稳较快发展,国内生产总值从26.6万亿元增加到51.9万亿元,

HDU 4937 (杭电多校 #7 1003题)Lucky Number(瞎搞)

题目地址:HDU 4937 多校的题以后得重视起来...每道题都错好多次...很考察细节.比如这道....WA了无数次.... 这题的思路自己真心想不到...这题是将进制后的数分别是1位,2位,3位和更多位的分开来计算. 当是1位的时候,显然只有3到6,此时只能是-1 当是2位的时候,可以转换成一元一次方程求解 当是3位的时候,可以转换成一元二次方程求解 当是4位的时候,此时最多也只有7000个数,7000^3接近1e12.所以剩下的直接枚举进制数来判断即可. 代码如下: #include <i

2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q questions. The i-th question is whether P remains balanced after pai and pbi  swapped. Note that questions ar