https://codeforces.com/contest/1477/problem/B
这题发现最后的字符串是固定的,且每次只能修改严格小于长度的一半
那么可以发现从后往前还原回去,每一段是还原成全是1还是全是0就是确定的,因为最多修改严格小于一半
那么就是线段树区间查询区间覆盖,还原完第一次以后还要跟初始串比较一蛤
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,k,tot,cnt,ans;
int a[maxl],c[maxl];
char s[maxl];
struct que
{
int l,r;
}q[maxl];
struct node
{
int l,r,tag,tagx,sum;
}tr[maxl*4];
bool vis[maxl];
inline void push_up(int k)
{
tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
}
inline void build(int k,int l,int r)
{
tr[k].l=l;tr[k].r=r;tr[k].sum=0;tr[k].tag=tr[k].tagx=0;
if(l==r)
{
tr[k].sum=c[l];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
push_up(k);
}
inline void prework()
{
scanf("%d%d",&n,&m);
scanf("%s",s+1);
for(int i=1;i<=n;i++)
a[i]=s[i]-'0';
scanf("%s",s+1);
for(int i=1;i<=n;i++)
c[i]=s[i]-'0';
for(int i=1;i<=m;i++)
scanf("%d%d",&q[i].l,&q[i].r);
build(1,1,n);
}
inline void gank(int k)
{
if(tr[k].tag)
{
int x=tr[k].tagx;
tr[k<<1].sum=x*(tr[k<<1].r-tr[k<<1].l+1);
tr[k<<1|1].sum=x*(tr[k<<1|1].r-tr[k<<1|1].l+1);
tr[k<<1].tag=tr[k<<1|1].tag=1;
tr[k<<1].tagx=tr[k<<1|1].tagx=x;
tr[k].tag=0;
}
}
inline int sum(int k,int l,int r)
{
gank(k);
if(tr[k].l==l && tr[k].r==r)
return tr[k].sum;
int ret=0;
int mid=(tr[k].l+tr[k].r)>>1;
if(r<=mid)
ret=sum(k<<1,l,r);
else if(l>mid)
ret=sum(k<<1|1,l,r);
else
ret=sum(k<<1,l,mid)+sum(k<<1|1,mid+1,r);
push_up(k);
return ret;
}
inline void upd(int k,int l,int r,int x)
{
gank(k);
if(tr[k].l==l && tr[k].r==r)
{
tr[k].sum=x*(tr[k].r-tr[k].l+1);
tr[k].tag=1;tr[k].tagx=x;
return;
}
int mid=(tr[k].l+tr[k].r)>>1;
if(r<=mid)
upd(k<<1,l,r,x);
else if(l>mid)
upd(k<<1|1,l,r,x);
else
upd(k<<1,l,mid,x),upd(k<<1|1,mid+1,r,x);
push_up(k);
}
inline void mainwork()
{
ans=1;
for(int i=m;i>=1;i--)
{
int x=sum(1,q[i].l,q[i].r);
int len=q[i].r-q[i].l+1;
if(x<(len+1)/2)
upd(1,q[i].l,q[i].r,0);
else if((len-x)<(len+1)/2)
upd(1,q[i].l,q[i].r,1);
else
{
ans=0;
return;
}
}
for(int i=1;i<=n;i++)
if(sum(1,i,i)!=a[i])
ans=0;
}
inline void print()
{
puts(ans?"YES":"NO");
}
int main()
{
int t=1;
scanf("%d",&t);
while(t--)
{
prework();
mainwork();
print();
}
return 0;
}