zoukankan      html  css  js  c++  java
  • BZOJ3033 太鼓达人[欧拉回路]

    题目lyd又虐狗

    这题和luogu的某道无序字母对这题很像,只不过,这里相当于每次是要求一个二进制$k$位的数通过前面删掉一位,后面再加一位,变成下一个数,于是可以设计状态:对于每一个$k$位的二进制数$(overline{x_1x_2x_3...x_k})_2$,在点$(overline{x_1x_2x_3...x_{k-1}})_2$和$(overline{x_2x_3...x_k})_2$两点间连一条有向边,表示通过上一个数的末尾$k-1$位转移到了现在的以这个$k-1$位开头的新数上。然后,从字典序最小的点(0)开始按字典序(也就是数的大小)跑欧拉回路(回路因为是最后要回到起始的0点)。然后输出方案就行了。不过,上述方法基于一个前提:这个二进制数列长度是$2^k$的,因为不同的二进制数最多只有$2^k$种,并且通过测试发现确实可以构造出这样的长度$2^k$的序列

    code惊人的短,只要跑一个暴力$O(NM)$的欧拉回路就好了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #define rep(i,a,b) for(register int i(a);i<=b;++i)
     8 #define mst(x) memset(x,0,sizeof x)
     9 #define dbg(x) cerr << #x << " = " << x <<endl
    10 #define dbg2(x,y) cerr<< #x <<" = "<< x <<"  "<< #y <<" = "<< y <<endl
    11 using namespace std;
    12 typedef long long ll;
    13 typedef double db;
    14 typedef pair<int,int> pii;
    15 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    16 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    17 template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,1):0;}
    18 template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,1):0;}
    19 template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
    20 template<typename T>inline T read(T&x){
    21     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1;
    22     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    23 }
    24 const int N=1100,M=2500;
    25 int mp[N][N],stk[M],top,k,n,m;
    26 void dfs(int x){for(register int y=0;y<=n;++y)if(mp[x][y])mp[x][y]=0,dfs(y),stk[++top]=y&1;}
    27 
    28 int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
    29     read(k);n=1<<k-1,m=1<<k;
    30     rep(i,0,m-1)mp[i>>1][(i|(1<<k-1))^(1<<k-1)]=1;
    31     dfs(0);reverse(stk+1,stk+top+1);printf("%d ",m);
    32     rep(i,top-k+2,top)printf("%d",stk[i]);rep(i,1,top-k+1)printf("%d",stk[i]);
    33     return printf("
    "),0;
    34 }
    View Code

    总结:欧拉回路重在建图,发现问题的循环性和转移的相像处。

  • 相关阅读:
    [转载]Matlab实用小技巧
    Matlab rand randn randint
    Matlab取整
    Mathtype报错:MathType has detected an error in....
    [转载]十大编程算法助程序员走上高手之路
    (转)Free函数的参数一定要是malloc返回的那个指针
    sizeof,一个其貌不扬的家伙(转)
    ISO C Random Number Functions
    srand() rand() time(0)
    IOS之文件夹创建、删除,图片在本地的保存和加载
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/11757863.html
Copyright © 2011-2022 走看看