B. Nezzar and Binary String

纯粹的發表於2024-07-16

原題連結

題解

正著來發現很怪,倒著來發現順多了

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=114514;

ll tree[8*N]={0};
ll tag[8*N]={0};
string a,b;

void build(int node,int l,int r)
{
    tag[node]=-1;
    if(l==r)
    {
        tree[node]=b[l]-'0';
        return ;
    }

    int mid=(l+r)/2;
    build(node*2,l,mid);
    build(node*2+1,mid+1,r);
    tree[node]=tree[node*2]+tree[node*2+1];
}

void pushdown(int node,int l,int r)
{
    if(tag[node]==-1) return;

    tree[node]=(r-l+1)*tag[node];
    if(l!=r)
    {
        tag[node*2]=tag[node];
        tag[node*2+1]=tag[node];
    }
    tag[node]=-1;
}
bool flag=1;
int query(int node,int l1,int r1,int x,int y)
{
    pushdown(node,l1,r1);
    if(l1>y||r1<x) return 0;
    if(l1>=x&&r1<=y)
    {
        return tree[node];
    }

    int mid=(l1+r1)/2;
    return query(node*2,l1,mid,x,y)+query(node*2+1,mid+1,r1,x,y);
}

void update(int node,int l1,int r1,int x,int y,int val)
{
    pushdown(node,l1,r1);
    if(l1>y||r1<x) return ;

    if(l1>=x&&r1<=y)
    {
        tag[node]=val;
        pushdown(node,l1,r1);
        return;
    }

    int mid=(l1+r1)/2;
    update(node*2,l1,mid,x,y,val);
    update(node*2+1,mid+1,r1,x,y,val);
    tree[node]=tree[node*2]+tree[node*2+1];
}
int l[2*N],r[2*N];

void solve()
{
    int n,q;
    cin>>n>>q;

    cin>>a>>b;
    a=' '+a;
    b=' '+b;

    build(1,1,n);
    for(int i=1;i<=q;i++) cin>>l[i]>>r[i];

    flag=1;
    for(int i=q;i>=1;i--)
    {
        int one=query(1,1,n,l[i],r[i]);
        //printf("ones:%d\n",one);
        if(one*2==r[i]-l[i]+1)
        {
            flag=0;
            break;
        }

        int id=(one*2>r[i]-l[i]+1);
        update(1,1,n,l[i],r[i],id);
    }
    for(int i=1;i<=n;i++)
    {
        //printf("%d's   query:%d\n",i,query(1,1,n,i,i));
        if(query(1,1,n,i,i)!=a[i]-'0') flag=0;
    }
    if(flag) puts("yes");
    else puts("no");
}
int main()
{
    //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) solve();
    return 0;
}