Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2)
闲话:这场比赛又是心态场,签到完A之后以及半个多小时了,实属是慌,自以为是做不出来的了,反而跑去干别的(水群),后来想着破罐子破摔,没想到bc居然那么简单,最后是切完b,c还没提交了over了。所以说还是那句话,还没有结束千万别放弃。(就像校赛的数位dp,在结束前二十分钟切掉。)
A. Game of Life
题意
意思是给一段01序列和数字k,可以进行k次操作,每次操作可以把所有相邻两边只有一个1的那个0变成1.输出最后结果。
题解
模拟即可。
code
using namespace std;
const int N=1e3+33;
char a[N],b[N];
int main()
{
IOS
int t;cin>>t;
while(t--){
int n,m;
cin>>n>>m;
int all=0;
memset(a,'0',sizeof a);
memset(b,'0',sizeof b);
for(int i=1;i<=n;i++){
char d;
cin>>d;
b[i]=a[i]=d;
if(a[i]=='0')all++;
}
for(int j=0;j<m&&j<all;j++){
for(int i=1;i<=n;i++)a[i]=b[i];
for(int p=1;p<=n;p++){
int now=0;
if(a[p-1]=='1')now++;
if(a[p+1]=='1')now++;
if(a[p]=='0'&&now==1)b[p]='1';
}
}
for(int i=1;i<=n;i++){
cout<<b[i];
}
cout<<'\n';
}
return 0;
}
B. Lord of the Values
题意
给一段数列长为m,要通过n次操作把所有数变相反数。操作是指:
- 选i,j。i<j
- 操作1:a[i]=a[i]+a[j]
- 操作2:a[j]=a[j]-a[i]
n不必最小化,并且数列数量为偶数。
题解
数列数量为偶数,于是我们发现有通解。
任选a[i],a[j]。进行以下操作:
0 a[i] a[j]
1 a[i]+a[j] a[j]
2 a[i]+a[j] -a[i]
2 a[i]+a[j] -2*a[i]-a[j]
1 -a[i] -2*a[i]-a[j]
2 -a[i] -a[i]-a[j]
2 -a[i] -a[j]
于是我们可以两两配对进行操作。
没对是6次,总共是m/2*6,并不会超出答案限制。
code
using namespace std;
const int N=1e3+33;
char a[N],b[N];
int main()
{
IOS
int t;cin>>t;
while(t--){
int n;
cin>>n;
int d;
for(int i=1;i<=n;i++)cin>>d;
int mid=n/2;
cout<<n/2*6<<'\n';
for(int i=1;i<=mid;i++){
cout<<1<<' '<<i<<' '<<i+mid<<'\n';
cout<<2<<' '<<i<<' '<<i+mid<<'\n';
cout<<2<<' '<<i<<' '<<i+mid<<'\n';
cout<<1<<' '<<i<<' '<<i+mid<<'\n';
cout<<2<<' '<<i<<' '<<i+mid<<'\n';
cout<<2<<' '<<i<<' '<<i+mid<<'\n';
}
cout<<'\n';
}
return 0;
}
C. Compression and Expansion
题意
看题很难看出来,不妨看看样例
发现输入的是标题末尾数字,要将完整标题输出。
通解
一道模拟题。当我们发现当前是1时,就得在原有标题后面再多一级标题,若当前是结尾+1说明是同级标题的下一列,否者说明当前应该是上级标题,那么我们就循环往前推,知道发现一个标题等于当前减一,也就是当前应该放的同级位置,将其替换上去即可。
code
using namespace std;
typedef long long ll;
inline ll read()
{
ll x=0,flag=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') flag=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*flag;
}
ll a[1005];
ll ans[1005];
int main()
{
ll t=read();
while(t--)
{
ll n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
printf("1\n");
ll len=1;
ans[1]=1;
for(int i=2;i<=n;i++)
{
if(a[i]==1)
{
ans[++len]=1;
}
else
{
while(a[i]!=ans[len]+1)
{
len--;
}
ans[len]=a[i];
}
for(int j=1;j<len;j++)
{
printf("%lld.",ans[j]);
}
printf("%lld\n",ans[len]);
}
}
return 0;
}