中文题意:

给你两个长度为 \(n\) 的01串 \(s,f,\)有 \(q\) 次询问。

每次询问有区间 \([\ l,r\ ]\) ,如果 \([\ l,r\ ]\) 同时包含\(0\)和\(1\),则询问终止,否则你可以将区间\([\ l,r\ ]\) 内严格小于 \(len_{lr}\) 的数字。

问是否可以使得询问不终止,且经过 \(q\) 次询问后可以将\(s\)改为\(f\)。

前置知识:

线段树

没了

思路:

发现没法正序推过去(反正我不会),考虑根据询问逆推。

那么对于 \(f\) ,和 \(q_{1},q_{2}\)···\(q_{n}\) ,用 \(l_{i},r_{i}\) 来表示 \(q_{i}\) , \(s_{i}\)表示经过前 \(i\) 次询问后的字符串 \(s\) 。

对于第 \(n\) 次询问,当且仅当 \(s_{n-1}\)中的 \([l_{n},r_{n}]\) 全为 \(k\) ( \(k\) \(\in\) \((0,1)\) ) ,\(f\) 在 \([l_{n},r_{n}]\) 内(\(k\oplus 1\))的数量\(num_{k\oplus 1}\) \(<\) \(len_{lr}\) 时,

\(s_{n-1}\) 可转化 \(f\) 。

那么,我们可以从 \(f\) 开始向前遍历询问。对于 \([l_{n},r_{n}]\) 将 \([l_{n},r_{n}]\) 内数量较少的数字改为另一个数字。

显然,当 \([l_{n},r_{n}]\) 内 \(num_{1} = num_{0}\) 时,询问会终止,因为改变量必须严格小于区间长度的一半。

遍历到最后判断 \(s\) 和经过转化的 \(f\) 是否相同就行了。

做法:

对于区间,查询和改变问题,我们可以用线段树在 \(log\ n\) 的复杂度下解决。

首先对于 \(f\) 建立线段树,维护区间内 \(1\) 的数量。

对于区间修改,建立 \(lazy\) 标记,\(-1\) 表示不变,\(0\) 表示 \(lazy\) 下的区间全为\(0\),\(1\) 表示 \(lazy\) 下的区间全为\(1\)。

\(pusdown\) 操作:

inline void pushdown(int p,int l,int r)
{
if(laz[p]==-1)//未被标记跳过
return ;
int mid=(l+r)>>1;
if(laz[p])//标记为1
{
tr[p<<1]=(mid-l+1);
tr[p<<1|1]=(r-mid);
laz[p<<1]=laz[p<<1|1]=1;
laz[p]=-1;
return ;
}
tr[p<<1]=tr[p<<1|1]=0;//标记为0
laz[p<<1]=laz[p<<1|1]=0;
laz[p]=-1;
}

剩下的就是线段树的基本操作了。

Code:

#include<bits/stdc++.h>
#define N 240000
using namespace std; int t,n,q;
char s[N],f[N];
int ql[N],qr[N],tr[N<<2],laz[N<<2]; inline int read()
{
char a=0;int w=1,x=0;
while(a<'0'||a>'9'){if(a=='-')w=-1;a=getchar();}
while(a<='9'&&a>='0'){x=(x<<3)+(x<<1)+(a^48);a=getchar();}
return x*w;
} inline void pushdown(int p,int l,int r)
{
if(laz[p]==-1)//未被标记跳过
return ;
int mid=(l+r)>>1;
if(laz[p])//标记为1
{
tr[p<<1]=(mid-l+1);
tr[p<<1|1]=(r-mid);
laz[p<<1]=laz[p<<1|1]=1;
laz[p]=-1;
return ;
}
tr[p<<1]=tr[p<<1|1]=0;//标记为0
laz[p<<1]=laz[p<<1|1]=0;
laz[p]=-1;
} void build(int p,int l,int r)//建树
{
laz[p]=-1;
if(l==r)
{
tr[p]=(f[l]^48);
return ;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
tr[p]=tr[p<<1]+tr[p<<1|1];
} int que(int p,int l,int r,int L,int R)//查询1的数量
{
if(L<=l&&r<=R)
return tr[p];
pushdown(p,l,r);
int mid=(l+r)>>1;
int ans=0;
if(mid>=L)
ans+=que(p<<1,l,mid,L,R);
if(mid<R)
ans+=que(p<<1|1,mid+1,r,L,R);
return ans;
} void modify(int p,int l,int r,int L,int R,int opt)//区间修改
{
if(L<=l&&r<=R)
{
tr[p]=opt*(r-l+1);
laz[p]=opt;
return ;
}
pushdown(p,l,r);
int mid=(l+r)>>1;
if(mid>=L)
modify(p<<1,l,mid,L,R,opt);
if(mid<R)
modify(p<<1|1,mid+1,r,L,R,opt);
tr[p]=tr[p<<1]+tr[p<<1|1];
} int main()
{
t=read();
while(t--)
{
n=read();
q=read();
int flag=1;
scanf("%s%s",(s+1),(f+1));
for(register int i=1;i<=q;i++)
{
ql[i]=read();
qr[i]=read();
}
build(1,1,n);
for(register int i=q;i>=1;i--)
{
int len=qr[i]-ql[i]+1;//区间长度
int num=que(1,1,n,ql[i],qr[i]);//查询区间内1的数量
if( num==len-num )//区间内0的数量为 len-num , 0和1数量相同时不可能成立
{
flag=0;
break;
}
modify(1,1,n,ql[i],qr[i],num>(len-num) );//区间修改
}
if(!flag)
{
printf("NO\n");
continue;
}
for(register int i=1;i<=n;i++)
{
int num=que(1,1,n,i,i);//取出经过q次询问后f的第i位
if(num!=(s[i]^48))//判断f和s是否相等,不相等退出
{
flag=0;
break;
}
}
if(!flag)
{
printf("NO\n");
continue;
}
printf("YES\n");
}
return 0;
}

Codeforces #698 (Div. 2) E. Nezzar and Binary String 题解的更多相关文章

  1. Codeforces 862D. Mahmoud and Ehab and the binary string (二分)

    题目链接:Mahmoud and Ehab and the binary string 题意: 一道交互题,首先给出一个字符串的长度l.现在让你进行提问(最多15次),每次提问提出一个字符串,会返回这 ...

  2. codeforces D. Mahmoud and Ehab and the binary string(二分)

    题目链接:http://codeforces.com/contest/862/submission/30696399 题解:这题一看操作数就知道是二分答案了.然后就是怎么个二分法,有两种思路第一种是找 ...

  3. Codeforces 862D. Mahmoud and Ehab and the binary string 【二分】(交互)

    <题目链接> 题目大意: 有一个长度为n(n<1000)的01串,该串中至少有一个0和一个1,现在由你构造出一些01串,进行询问,然后系统会给出你构造的串与原串的   Hamming ...

  4. Codeforces.862D.Mahmoud and Ehab and the binary string(交互 二分)

    题目链接 \(Description\) 有一个长为\(n\)的二进制串,保证\(01\)都存在.你可以询问不超过\(15\)次,每次询问你给出一个长为\(n\)的二进制串,交互库会返回你的串和目标串 ...

  5. Codeforces Round #598 (Div. 3) D. Binary String Minimizing 贪心

    D. Binary String Minimizing You are given a binary string of length n (i. e. a string consisting of ...

  6. D2. Kirk and a Binary String (hard version) D1 Kirk and a Binary String (easy version) Codeforces Round #581 (Div. 2) (实现,构造)

    D2. Kirk and a Binary String (hard version) time limit per test1 second memory limit per test256 meg ...

  7. Codeforces Round #598 (Div. 3) D. Binary String Minimizing

    You are given a binary string of length nn (i. e. a string consisting of nn characters '0' and '1'). ...

  8. Educational Codeforces Round 94 (Rated for Div. 2) String Similarity、RPG Protagonist、Binary String Reconstruction、Zigzags 思维

    题目链接:String Similarity 题意: 首先题目定义了两个串的相似(串的构成是0.1),如果两个串存在对于一个下标k,它们的值一样,那么这两个串就相似 然后题目给你一个长度为2n-1的串 ...

  9. Codeforces #344 Div.2

    Codeforces #344 Div.2 Interview 题目描述:求两个序列的子序列或操作的和的最大值 solution 签到题 时间复杂度:\(O(n^2)\) Print Check 题目 ...

随机推荐

  1. javap使用

    在反编译前你当然需要先编译这个类了进入当前目录下:javac -g SynchronizedTest.java(使用-g参数是因为要得到下面javap -l时的输出需要使用此选项) 编译完成后,我们在 ...

  2. 手摸手带你用Hexo撸博客(一)

    原文地址 手摸手带你用Hexo撸博客(一) 环境搭建 安装 node 狂点下一步 命令行输入此条命令 如果能看到版本号则安装成功 node -v 安装Git (同上) 实在不会的小伙伴百度一下,教程很 ...

  3. Mac电脑远程连接SSH Host key verification failed 解决办法

    苹果电脑远程连接SSH出现如下问题: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                     ...

  4. [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I]

    [简单-剑指 Offer 53 - I. 在排序数组中查找数字 I] 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出 ...

  5. SAAS云平台搭建札记: (三) AntDesign + .Net Core WebAPI权限控制、动态菜单的生成

    我们知道,当下最火的前端框架,非蚂蚁金服的AntDesign莫属,这个框架不仅在国内非常有名,在国外GitHub上React前端框架也排名第一.而且这个框架涵盖了React.Vue.Angular等多 ...

  6. 利用dotnet-dump分析docker容器内存泄露

    目录 一 运行官方示例 1,Clone代码并编译 2,创建Dockerfile构建镜像 3,启动容器 二 生成dump转储文件 1,制造问题 2,创建dump文件 三 分析dump文件 1,创建一个用 ...

  7. .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ Masstransit 介绍)--学习笔记

    2.6.6 RabbitMQ -- Masstransit 介绍 Masstransit 是什么 Quickstart 消息 Message Masstransit 是什么 Masstransit 是 ...

  8. 解锁Renderbus客户端使用新技巧----快速渲染效果图篇

    度娘说,效果图最基本的要求就是:应该符合事物的本身尺寸,不能为了美观而使用效果把相关模型的尺寸变动,那样的效果图不但不能起到表现设计的作用,反而成为影响设计的一个因素.可见高效渲染效果图是都是当下我们 ...

  9. Java实现PDF和Excel生成和数据动态插入以及导出

    一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...

  10. LeetCode117 每个节点的右向指针 II

    给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充它的每个 ...