//no comment needed #include <cstdio> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <string.h> #include <strings.h> #include <math.h> #include <time.h> #include <map> #include <climits> using namespace std; //Two of the most frequently used typical of long names, make life easier typedef vector<int> VI; typedef long long LL; /* HEADERS */ /* Loops */ // FOR - loop increasing 'x' from 'b' to 'e' inclusive #define FOR(x, b, e) for(int x = b; x <= (e); ++x) // FORD - loop decreasing 'x' from 'b' to 'e' inclusive #define FORD(x, b, e) for(int x = b; x >= (e); --x) // REP - loop increasing 'x' from '0' to 'n'. Used to search and build DS #define REP(x, n) for(int x = 0; x < (n); ++x) // Clone long type of 'n' #define VAR(v, n) __typeof(n) v = (n) // ALL(c) represents the pair of iterators, indicating begin-end elements in the STL DS #define ALL(c) (c).begin(), (c).end() //Macro to get size of STL DS, used to avoid compilation warrning with int and uint comp #define SIZE(x) ((int)(x).size()) // Very profitable macro aimed to iterate through all elements of STL DS #define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) /* Shortcuts for vectors most common use cases*/ #define PB push_back #define POP pop_back #define ST first #define ND second #define RM( v, x ) v.erase(v.begin() + x) #define PF( v, x ) v.insert(v.begin(), x); #define FIND(v, x) find(v.begin(), v.end(), x) #define Vit std::vector<int>::iterator /* some other usefull methods */ #define INF INT_MAX/2-256 #define _il inline #define _ili inline int #define _ilv inline void #define IN "test_org.in" #define OUT "test.out" #define ERR "sample.err" _ilv sol(VI&, int, int ); //debug print void print_v(VI v){ fprintf(stderr, "vec:: "); FOREACH(it, v) fprintf(stderr, "%d, ", *it); fprintf(stderr, "\n"); } int main(){ // freopen(IN, "r", stdin); // freopen(OUT, "w", stdout); // freopen(ERR, "w", stderr); int n, t; cin >> n; cin >> t; int N = 1 << n; VI deck; REP(x, N){ int c; cin >> c; deck.push_back(c); } REP(tt, t){ sol(deck, n, N); //run sol } FOREACH(it, deck) fprintf(stdout, "%d ", *it); return 0; } _ilv sol(VI &deck, int n, int N) { //do work for(int i=0; i<N; i+=2){ int tmp = deck[i]; deck[i] = deck[i+1]; deck[i+1] = tmp; } //print_v(deck); //fprintf(stderr, "------- copying: \n"); for(int i=1; i<n; i++){ int nn = 1<<i; VI tmp(nn); //fprintf(stderr, "#: copy for i=%d, nn=%d \n", i, nn); for(int x=0; x<N-nn; x+=2*nn){ //copy to tmp //fprintf(stderr, "###: x= %d \n", x); for(int j=0;j<nn;j++) tmp[j] = deck[j+x]; //fprintf(stderr, "###: tmp: \n"); //print_v(tmp); for(int j=0;j<nn;j++) deck[j+x]=deck[j+x+nn]; //fprintf(stderr, "###: deck: \n"); //print_v(deck); for(int j=0;j<nn;j++) deck[j+x+nn]=tmp[j]; //fprintf(stderr, "###: deck: \n"); //print_v(deck); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | //no comment needed #include <cstdio> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <string.h> #include <strings.h> #include <math.h> #include <time.h> #include <map> #include <climits> using namespace std; //Two of the most frequently used typical of long names, make life easier typedef vector<int> VI; typedef long long LL; /* HEADERS */ /* Loops */ // FOR - loop increasing 'x' from 'b' to 'e' inclusive #define FOR(x, b, e) for(int x = b; x <= (e); ++x) // FORD - loop decreasing 'x' from 'b' to 'e' inclusive #define FORD(x, b, e) for(int x = b; x >= (e); --x) // REP - loop increasing 'x' from '0' to 'n'. Used to search and build DS #define REP(x, n) for(int x = 0; x < (n); ++x) // Clone long type of 'n' #define VAR(v, n) __typeof(n) v = (n) // ALL(c) represents the pair of iterators, indicating begin-end elements in the STL DS #define ALL(c) (c).begin(), (c).end() //Macro to get size of STL DS, used to avoid compilation warrning with int and uint comp #define SIZE(x) ((int)(x).size()) // Very profitable macro aimed to iterate through all elements of STL DS #define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) /* Shortcuts for vectors most common use cases*/ #define PB push_back #define POP pop_back #define ST first #define ND second #define RM( v, x ) v.erase(v.begin() + x) #define PF( v, x ) v.insert(v.begin(), x); #define FIND(v, x) find(v.begin(), v.end(), x) #define Vit std::vector<int>::iterator /* some other usefull methods */ #define INF INT_MAX/2-256 #define _il inline #define _ili inline int #define _ilv inline void #define IN "test_org.in" #define OUT "test.out" #define ERR "sample.err" _ilv sol(VI&, int, int ); //debug print void print_v(VI v){ fprintf(stderr, "vec:: "); FOREACH(it, v) fprintf(stderr, "%d, ", *it); fprintf(stderr, "\n"); } int main(){ // freopen(IN, "r", stdin); // freopen(OUT, "w", stdout); // freopen(ERR, "w", stderr); int n, t; cin >> n; cin >> t; int N = 1 << n; VI deck; REP(x, N){ int c; cin >> c; deck.push_back(c); } REP(tt, t){ sol(deck, n, N); //run sol } FOREACH(it, deck) fprintf(stdout, "%d ", *it); return 0; } _ilv sol(VI &deck, int n, int N) { //do work for(int i=0; i<N; i+=2){ int tmp = deck[i]; deck[i] = deck[i+1]; deck[i+1] = tmp; } //print_v(deck); //fprintf(stderr, "------- copying: \n"); for(int i=1; i<n; i++){ int nn = 1<<i; VI tmp(nn); //fprintf(stderr, "#: copy for i=%d, nn=%d \n", i, nn); for(int x=0; x<N-nn; x+=2*nn){ //copy to tmp //fprintf(stderr, "###: x= %d \n", x); for(int j=0;j<nn;j++) tmp[j] = deck[j+x]; //fprintf(stderr, "###: tmp: \n"); //print_v(tmp); for(int j=0;j<nn;j++) deck[j+x]=deck[j+x+nn]; //fprintf(stderr, "###: deck: \n"); //print_v(deck); for(int j=0;j<nn;j++) deck[j+x+nn]=tmp[j]; //fprintf(stderr, "###: deck: \n"); //print_v(deck); } } } |