CF1978E 题解
题意
给定
- 若
s_i=0 且s_{i+2}=0 ,可将t_{i+1} 赋为1 。 - 若
t_i=1 且t_{i+2}=1 ,可将s_{i+1} 赋为1 。
求经过若干次操作后
思路
考虑一个区间的最优操作方案,发现先用
接着考虑每一位会怎样被改变。若
因此可以提前对整个区间进行操作,并对最终的
代码
#include<iostream>
using namespace std;
const int N=2e5+10;
int n,q,pre[N],s[N],t[N],ts[N],tt[N];
char ss[N],st[N];
void solv(int l,int r)
{
int len=r-l+1;
for(int i=l;i<=r;i++) ts[i-l+1]=s[i],tt[i-l+1]=t[i];
for(int i=1;i+2<=len;i++) if(!ts[i]&&!ts[i+2]) tt[i+1]=1;
for(int i=1;i+2<=len;i++) if(tt[i]&&tt[i+2]) ts[i+1]=1;
for(int i=1;i<=len;i++) ts[i]+=ts[i-1];
}
void sol()
{
cin>>n>>ss>>st>>q;
for(int i=1;i<=n;i++) s[i]=ss[i-1]-'0',t[i]=st[i-1]-'0';
solv(1,n);
for(int i=1;i<=n;i++) pre[i]=ts[i];
while(q--)
{
int l,r; cin>>l>>r;
if(r-l<4) solv(l,r),cout<<ts[r-l+1]<<'\n';
else
{
int res=pre[r-2]-pre[l+1];
solv(l,l+4),res+=ts[2];
solv(r-4,r),res+=(ts[5]-ts[3]);
cout<<res<<'\n';
}
}
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int T; cin>>T;
while(T--) sol();
return 0;
}