题解 P2104 【二进制】
我们可以统一最后算出答案(而且不麻烦,因为保证了加减不进位)。
如果一个二进制数的下一位进了两位,那么我这一位一定进一位。
如果上一个二进制退了两位,我,这里一定也退了一位。
于是,此题的核心就是,我们可以像线段树的懒操作(区间加法用的那个),延迟更新答案。这样比较快。
我们存两个数组,应该是
我们加的话,直接在最低位上加就好了,如果我们要除的话,我们就要把最低位的“懒操作”标记数组
设
1.如果
2.如果
为什么呢?因为大于
做完后开始计算真正的
最后从
#include <bits/stdc++.h>
using namespace std;
int n,m;
int p0,p1;
int a[10000005];
int b[10000005];
char in[6000005];
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",in+1);
int op=0;
for(int i=1;i<=n;i++)
a[i]=in[i]-'0';
scanf("%s",in+1);
for(int i=1;i<=m;i++)
{
if(in[i]=='+')
{
b[n]+=1;
}
if(in[i]=='-')
{
b[n]-=1;
}
if(in[i]=='*')
{
n++;
a[n]=0;
b[n]=0;
}
if(in[i]=='/')
{
int an=a[n]+b[n];
if(an<0)
an-=1;
b[n-1]+=(an)/2;
n--;
}
}
for(int i=n;i>=1;i--)
{
int an=a[i]+b[i];
a[i]=((a[i]+b[i])%2+2)%2;
if(an<0)
an-=1;
b[i-1]+=an/2;
}
for(int i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
return 0;
}