I - Infinite Improbability Drive

I - Infinite Improbability Drive
http://codeforces.com/gym/241750/problem/I
不断构造,先填n-1个0,然后能放1就放1,最后这个序列的长度就是(1<<n)+n-1,也就是每添加1位就要匹配出来一个。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<set>
 8 #include<map>
 9 #include<stack>
10 #include<cstring>
11 #define inf 2147483647
12 #define ls rt<<1
13 #define rs rt<<1|1
14 #define lson ls,nl,mid,l,r
15 #define rson rs,mid+1,nr,l,r
16 #define N 100010
17 #define For(i,a,b) for(int i=a;i<=b;i++)
18 #define p(a) putchar(a)
19 #define g() getchar()
20 
21 using namespace std;
22 int n;
23 int a[10000000];
24 bool vis[10000000];
25 int ans,t,fin;
26 
27 void in(int &x){
28     int y=1;
29     char c=g();x=0;
30     while(c<'0'||c>'9'){
31         if(c=='-')y=-1;
32         c=g();
33     }
34     while(c<='9'&&c>='0'){
35         x=(x<<1)+(x<<3)+c-'0';c=g();
36     }
37     x*=y;
38 }
39 void o(int x){
40     if(x<0){
41         p('-');
42         x=-x;
43     }
44     if(x>9)o(x/10);
45     p(x%10+'0');
46 }
47 int main(){
48     freopen("infinite.in","r",stdin);
49     freopen("infinite.out","w",stdout);
50     in(n);
51     fin=(1<<n)+n-1;
52     a[n]=1;
53     vis[1]=1;
54     For(i,n+1,fin){
55         a[i]=1;
56         t=1;
57         ans=0;
58         for(int j=i;j>=i-n+1;j--){
59             ans+=t*a[j];
60             t<<=1;
61         }
62         if(vis[ans]){
63             vis[ans-1]=1;
64             a[i]=0;
65         }
66         else
67             vis[ans]=1;
68     }
69     For(i,1,fin)
70         o(a[i]);
71     return 0;
72         
73 }
View Code

 

posted @ 2019-04-05 16:57  WeiAR  阅读(201)  评论(0编辑  收藏  举报