题目链接
题面:
题意: n n n 张纸从上到下放置,从左往右折叠 k k k 次,折叠后,给 n ∗ 2 ∗ ( 1 < < k ) n*2*(1<<k) n∗2∗(1<<k) 个面都标上数字。 每张纸每个面上都有 ( 1 < < k ) (1<<k) (1<<k) 个数字,按照从左到右,从上到下的顺序输出这些数字。
题解: 模拟即可。
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<queue> #include<bitset> #include<map> #include<unordered_map> #include<unordered_set> #include<set> #include<ctime> #define ui unsigned int #define ll long long #define llu unsigned ll #define ld long double #define pr make_pair #define pb push_back #define lc (cnt<<1) #define rc (cnt<<1|1) #define len(x) (t[(x)].r-t[(x)].l+1) #define tmid ((l+r)>>1) #define fhead(x) for(int i=head[(x)];i;i=nt[i]) #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)>(y)?(y):(x)) using namespace std; const int inf=0x3f3f3f3f; const ll lnf=0x3f3f3f3f3f3f3f3f; const double dnf=1e18; const double alpha=0.75; const int mod=998244353; const double eps=1e-8; const double pi=acos(-1.0); const int hp=13331; const int maxn=1100; const int maxm=100100; const int maxp=100100; const int up=1100; vector<int>vc[maxn]; int cnt[maxn]; int main(void) { int tt; scanf("%d",&tt); while(tt--) { int n,k; scanf("%d%d",&n,&k); int len=(1<<k); for(int i=0;i<=len;i++) vc[i].clear(),cnt[i]=1,vc[i].pb(0); int x; for(int i=1;i<=len*2*n;i++) { scanf("%d",&x); vc[len].pb(x); } for(int i=k-1;i>=0;i--) { int num=(1<<i)*n*2; int l=len-(1<<(k-i))+1; for(int r=len;r>l;r--,l++) { for(int j=cnt[r]+num-1;j>=cnt[r];j--) vc[l].pb(vc[r][j]); cnt[r]+=num; } } vector<int>ans; ans.clear(); for(int i=1;i<=n*2;i++) { for(int j=1;j<=len;j++) { if(cnt[j]<vc[j].size()) ans.pb(vc[j][cnt[j]]),cnt[j]++; } } for(int i=0;i<ans.size();i++) { if(i!=0) putchar(' '); printf("%d",ans[i]); } putchar('\n'); } return 0; }
