2021.11.9-测试
今天的测试,挂的太惨了
T1
题目描述:对于一个长度为n的01串,有k个1,求包含奇数个1的区间的长度
找规律:
当\(k=1\)时:
我们可以知道\(ans=x*y\)
而当\(k=2\)时
也是与1的情况相类似,通过计算的得到ans
这里就不打出来了
.
.
.
.
.
.
那么对于\(k=n\)的情况,我们可以算到3,然后直接看出规律
最后得到结论:
将k个1全部放在前面,最后一个1放在\((n+k+1-(k\&1)>>1)\)处
代码巨短,但我不会
考试的时候只算到了3的情况,导致最后只有40
哎~
所以这一次测试也告诉我:
“DON'T GIVE UP EARLY!”
注意特判
#include<bits/stdc++.h>
#define re register
using namespace std;
int n,k;
int ans[100005];
int main(){
scanf("%d%d",&n,&k);
for(re int i=1;i<=n;++i)ans[i]=0;
if(k==0){
cout<<0;
for(re int i=1;i<=n;++i)
printf("%d ",ans[i]);return 0;}
for(re int i=1;i<k;i++) ans[i]=1;
ans[n+k+1-(k&1)>>1]=1;
cout<<1ll*(n+1)*(n+1)/4<<endl;
for(int i=1;i<n;i++)
cout<<ans[i]<<" ";
cout<<ans[n];
return 0;
}
PS.