QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#423954 | #5954. Power Swapper | Suffix_Sum | 16 ✓ | 51ms | 4176kb | C++14 | 2.5kb | 2024-05-28 20:04:07 | 2024-05-28 20:04:08 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
int T;
int n;
struct node{
int a[5005];
}t;
int jc[50];
int dfs(int len,int cnt,node x)
{
if(len==0)
{
return jc[cnt];
}
int id1=0,id2=0;
for(int i=1;i<=(1<<len);i+=2)
{
if(x.a[i]%2!=1||x.a[i+1]!=x.a[i]+1)
{
if(id2!=0)
{
return 0;
}
id2=id1;
id1=i;
}
}
/*cout<<"!!"<<len<<" "<<cnt<<endl;
for(int i=1;i<=(1<<len);i++)
{
cout<<x.a[i]<<" ";
}
cout<<endl;
cout<<"::"<<id1<<" "<<id2<<endl<<endl;*/
node xx=x;
memset(xx.a,0,sizeof(xx.a));
if(id2==0&&id1==0)
{
for(int i=1;i<=(1<<len);i+=2)
{
xx.a[(i+1)/2]=(x.a[i]+1)/2;
}
return dfs(len-1,cnt,xx);
memset(xx.a,0,sizeof(xx.a));
}
else if(id2==0)
{
swap(x.a[id1],x.a[id1+1]);
for(int i=1;i<=(1<<len);i+=2)
{
xx.a[(i+1)/2]=(x.a[i]+1)/2;
}
return dfs(len-1,cnt+1,xx);
memset(xx.a,0,sizeof(xx.a));
}
else
{
if(x.a[id1]%2==0&&x.a[id2]%2==0)
{
return 0;
}
else if(x.a[id1]%2==0)
{
if(x.a[id1+1]%2==1)
{
return 0;
}
if(x.a[id1]>x.a[id2]&&x.a[id1+1]<x.a[id2+1])
{
return 0;
}
if(x.a[id1]<x.a[id2]&&x.a[id1+1]>x.a[id2+1])
{
return 0;
}
swap(x.a[id1],x.a[id2+1]);
for(int i=1;i<=(1<<len);i+=2)
{
xx.a[(i+1)/2]=(x.a[i]+1)/2;
}
return dfs(len-1,cnt+1,xx);
memset(xx.a,0,sizeof(xx.a));
}
else if(x.a[id2]%2==0)
{
if(x.a[id2+1]%2==1)
{
return 0;
}
if(x.a[id1]>x.a[id2]&&x.a[id1+1]<x.a[id2+1])
{
return 0;
}
if(x.a[id1]<x.a[id2]&&x.a[id1+1]>x.a[id2+1])
{
return 0;
}
swap(x.a[id1+1],x.a[id2]);
for(int i=1;i<=(1<<len);i+=2)
{
xx.a[(i+1)/2]=(x.a[i]+1)/2;
}
return dfs(len-1,cnt+1,xx);
memset(xx.a,0,sizeof(xx.a));
}
else
{
//cout<<"!!"<<endl;
int re=0;
swap(x.a[id1],x.a[id2]);
for(int i=1;i<=(1<<len);i+=2)
{
xx.a[(i+1)/2]=(x.a[i]+1)/2;
}
re+=dfs(len-1,cnt+1,xx);
memset(xx.a,0,sizeof(xx.a));
swap(x.a[id1],x.a[id2]);
swap(x.a[id1+1],x.a[id2+1]);
for(int i=1;i<=(1<<len);i+=2)
{
xx.a[(i+1)/2]=(x.a[i]+1)/2;
}
re+=dfs(len-1,cnt+1,xx);
return re;
memset(xx.a,0,sizeof(xx.a));
}
}
}
signed main()
{
jc[0]=1;
for(int i=1;i<=24;i++)
{
jc[i]=jc[i-1]*i;
}
cin>>T;
for(int i=1;i<=T;i++)
{
cin>>n;
for(int j=1;j<=(1<<n);j++)
{
cin>>t.a[j];
}
cout<<"Case #"<<i<<": "<<dfs(n,0,t)<<endl;
}
return 0;
}
详细
Subtask #1:
score: 4
Accepted
Test #1:
score: 4
Accepted
time: 2ms
memory: 3864kb
input:
200 1 2 1 2 1 4 3 2 3 7 8 5 6 1 2 4 3 2 4 3 2 1 2 2 4 1 3 4 3 10 11 12 1 2 9 4 13 14 15 16 5 6 7 8 1 2 1 1 2 1 1 2 1 1 1 2 4 1 2 3 4 13 14 15 16 9 12 11 10 5 6 7 8 4 9 10 11 12 1 2 15 16 13 14 6 4 5 3 7 8 2 1 4 3 2 2 3 2 1 4 4 1 2 3 4 13 14 15 16 9 10 11 8 5 6 7 12 4 13 14 11 12 1 2 5 4 9 10 15 16 3...
output:
Case #1: 1 Case #2: 3 Case #3: 6 Case #4: 0 Case #5: 2 Case #6: 30 Case #7: 1 Case #8: 1 Case #9: 1 Case #10: 1 Case #11: 38 Case #12: 30 Case #13: 3 Case #14: 3 Case #15: 38 Case #16: 24 Case #17: 8 Case #18: 0 Case #19: 3 Case #20: 1 Case #21: 1 Case #22: 24 Case #23: 6 Case #24: 24 Case #25: 6 Ca...
result:
ok 200 lines
Subtask #2:
score: 12
Accepted
Test #2:
score: 12
Accepted
time: 51ms
memory: 4176kb
input:
200 1 2 1 2 1 4 3 2 3 7 8 5 6 1 2 4 3 2 4 3 2 1 6 33 34 35 36 37 38 39 40 41 42 43 44 19 20 51 52 47 10 11 12 13 14 15 16 57 58 59 60 61 62 63 64 1 2 3 4 5 6 7 8 45 46 9 48 53 54 55 56 17 18 49 50 21 22 23 24 25 26 27 28 29 30 31 32 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2...
output:
Case #1: 1 Case #2: 3 Case #3: 6 Case #4: 0 Case #5: 120 Case #6: 1 Case #7: 39916800 Case #8: 2 Case #9: 0 Case #10: 720 Case #11: 0 Case #12: 30 Case #13: 40320 Case #14: 780827760 Case #15: 448560 Case #16: 51120 Case #17: 45360 Case #18: 45360 Case #19: 1 Case #20: 1 Case #21: 1 Case #22: 780827...
result:
ok 200 lines
Extra Test:
score: 0
Extra Test Passed