[COCI2010-2011#6]STEP

这篇具有很好参考价值的文章主要介绍了[COCI2010-2011#6]STEP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.题目:

题目描述

输入格式

输出格式

2.思路

1.ans数组的维护

2.L and R 的维护

3.ne数组与pr数组的维护

4.len数组:

 3.代码:

1.有注释版:

2.copy版:

1.题目:

题目描述

给定一个长度为N的字符序列  ,初始时序列中全部都是字符L。

有 q次修改,每次给定一个 x,若为L,则将 修改成R,否则将 修改成L。

对于一个只含字符 L,R的字符串S,若其中不存在连续的L和R,则称 S满足要求。

每次修改后,请输出当前序列 中最长的满足要求的连续子串的长度。

输入格式

第一行有两个整数,分别表示序列的长度 n 和修改操作的次数 q。

接下来 q 行,每行一个整数,表示本次修改的位置 x。

输出格式

对于每次修改操作,输出一行一个整数表示修改 a 中最长的满足要求的子串的长度。

 一句话解释(不知道大家了解不) :最长01交替字串

2.思路

我们循序渐进,慢慢分析:(码力重点呀!!!)

首先:单点修改,动态维护最长,很明显是线段树

那么:首先,应该有一个数组来记录最长的字串。

1.ans数组的维护

继续分析:

区区线段树,必有的操作是建一棵树(此处以区间和为基准)

void build(int l,int r,int k)
{
    if(l==r){cin>>c[k];return;}
    int mid=(l+r)>>1;
    build(l,mid,lk);
    build(mid+1,r,lk|1);
    c[k]=c[lk]+c[lk|1];
}//oh,lk与rk是define,后文有

注意一下:

最后一排

c[k]=c[lk]+c[lk|1];

是一个合并的过程

题目描述中提到:能否合并,must 左区间的右端点 != 右区间的左端点

所以拿两个数组: 表示左端点是什么 , 表示右端点是什么。

那么,就可以推如何合并了。

如果ans[root]的左区间的右端点=ans[root]的右区间的左端点,那么不满足要求,代码就是

ans[root]=max(ans[root<<1],ans[root<<1|1])
/*
注意,我这里用的是位运算(个人喜好)
root<<1 就是root*2
root<<1|1 就是root*2+1(因为<<1保证了root二进制的末尾为0,所以或1后就得root+1)
*/

如果ans[root]的右区间的左端点!=ans[root]的左区间的右端点,那么就可以合并。

蒙了吧?我也蒙了

来人!本蒟蒻的树呢?

[COCI2010-2011#6]STEP,题解,题解

(图片来源:Graph Editor (csacademy.com))

那么相等怎么合并呢???(更晕的来了)

就是上图中以R为右端点的最长01字串+以L为左端点的最长01字串的和,在与[COCI2010-2011#6]STEP,题解,题解的最大值作比较,取最大值。

综合就是:

#define lk k<<1
a[k]=max(a[lk],r[lk]!=l[rk]?max(a[rk],ne[lk]+pr[rk]):a[rk]);//ne数组是后缀,pr数组是前缀。

所以像消消乐一样,只有下面几个问题等我们维护:

  • R 数组的维护
  • L 数组的维护
  • ne 数组的维护
  • pr 数组的维护

所以慢慢看······

2.L and R 的维护

这个简单呀!!!

你 ans[root*2]的左端点 就一定是 ans[root]的左端点

ans[root<<1|1]的右端点 就一定是ans[root]的右段点

(啥?why??)

给张图:

[COCI2010-2011#6]STEP,题解,题解

可以理解了吧!

3.ne数组与pr数组的维护

 直接来吧······

如果ne[rook*2]数组没有覆盖van左区间

那很明显,根节点的ne就是左区间的ne,

同样,pr[rook*2+1]数组没有覆盖van右区间

根节点的pr就是右区间的pr。

给张图:

[COCI2010-2011#6]STEP,题解,题解

 如果到已经l2已经不能继续了,那么从l1开始的ne 就只能到l2

R也一样。

但如何判断是否能覆盖呢?

所以还要引入len数组。

4.len数组:

很简单,建树时直接赋值即可。

 3.代码:

1.有注释版:

#include<bits/stdc++.h>
using namespace std;

#define lk k<<1
#define rk k<<1|1

const int N=2e5;
int n,q,x,len[N*4+10],a[N*4+10],l[N*4+10],r[N*4+10],pr[N*4+10],ne[N*4+10];

inline int read()//快读 
{
    int x=0,w=0;char c=0;
    while(!isdigit(c)) {w|=c=='-';c=getchar();}
    while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return w?-x:x;
}

void change(int k) 
{
	a[k]=max(a[lk],r[lk]!=l[rk]?max(a[rk],ne[lk]+pr[rk]):a[rk]);//维护总长度 
	l[k]=l[lk];//维护L 
	r[k]=r[rk];//维护R 
	if(pr[lk]==len[lk]&&r[lk]!=l[rk]) pr[k]=pr[lk]+pr[rk];//维护pr 
	else pr[k]=pr[lk];//维护pr
	if(ne[rk]==len[rk]&&r[lk]!=l[rk]) ne[k]=ne[lk]+ne[rk];//维护ne
	else ne[k]=ne[rk];//维护ne
}

void build(int ll,int rr,int k)//建树 
{
	len[k]=rr-ll+1;//维护len 
	if(ll==rr) {a[k]=pr[k]=ne[k]=1;return;}
	int mid=(ll+rr)>>1;
	build(ll,mid,lk),build(mid+1,rr,rk);
	change(k);
}

void modify(int x,int ll,int rr,int k)//修改 
{
	if(ll==rr)
	{
		a[k]=pr[k]=ne[k]=1;
		l[k]=(l[k]==0?1:0),r[k]=(r[k]==0?1:0);//维护l ,r
		return ;
	}
	int mid=(ll+rr)>>1;
	if(x<=mid) modify(x,ll,mid,lk);
	else modify(x,mid+1,rr,rk);
	change(k);
}

int main()
{
	n=read(),q=read();
	build(1,n,1);
	while(q--)
	{
		x=read();
		modify(x,1,n,1);
		printf("%d\n",a[1]);
	}
	return 0;
}

2.copy版:

#include<bits/stdc++.h>
using namespace std;

#define lk k<<1
#define rk k<<1|1

const int N=2e5;
int n,q,x,len[N*4+10],a[N*4+10],l[N*4+10],r[N*4+10],pr[N*4+10],ne[N*4+10];

inline int read()
{
    int x=0,w=0;char c=0;
    while(!isdigit(c)) {w|=c=='-';c=getchar();}
    while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return w?-x:x;
}

void change(int k) 
{
	a[k]=max(a[lk],r[lk]!=l[rk]?max(a[rk],ne[lk]+pr[rk]):a[rk]);
	l[k]=l[lk];
	r[k]=r[rk];
	if(pr[lk]==len[lk]&&r[lk]!=l[rk]) pr[k]=pr[lk]+pr[rk];
	else pr[k]=pr[lk];
	if(ne[rk]==len[rk]&&r[lk]!=l[rk]) ne[k]=ne[lk]+ne[rk];
	else ne[k]=ne[rk];
}

void build(int ll,int rr,int k)
{
	len[k]=rr-ll+1;
	if(ll==rr) {a[k]=pr[k]=ne[k]=1;return;}
	int mid=(ll+rr)>>1;
	build(ll,mid,lk),build(mid+1,rr,rk);
	change(k);
}

void modify(int x,int ll,int rr,int k)
{
	if(ll==rr)
	{
		a[k]=pr[k]=ne[k]=1;
		l[k]=(l[k]==0?1:0),r[k]=(r[k]==0?1:0);
		return ;
	}
	int mid=(ll+rr)>>1;
	if(x<=mid) modify(x,ll,mid,lk);
	else modify(x,mid+1,rr,rk);
	change(k);
}

int main()
{
	n=read(),q=read();
	build(1,n,1);
	while(q--)
	{
		x=read();
		modify(x,1,n,1);
		printf("%d\n",a[1]);
	}
	return 0;
}

(L('ω')┘点赞,关注,下篇博客再见 └('ω')」)文章来源地址https://www.toymoban.com/news/detail-556544.html

到了这里,关于[COCI2010-2011#6]STEP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2011 年考研数二真题解析

    【01】【02】【03】【04】【05】【06】【07】【08】 【09】【10】【11】【12】【13】【14】 【15】【16】【17】【18】【19】【20】【21】【22】【23】

    2024年01月18日
    浏览(50)
  • 计算机考研408真题2011年42题

    数据: 信息的载体 ,是描述客观事物属性的数、字符及所有能输入到计算机中并被 计算机程序识别和处理 的符号的集合。数据是计算机程序加工的原料 对于计算机来说,它所能识别和处理的,在底层硬件看来就是二进制的0和1 最初发明的计算机,就是用于处理纯数值型的

    2023年04月24日
    浏览(34)
  • 从[SDOI2011]消防 到[NOIP2007]树网的核

    有关消防一题中最优解一定在直径上的证明 P2491 [SDOI2011] 消防 P1099 [NOIP2007 提高组] 树网的核 在一颗 (n) 个节点的无根树中,找到一条不超过 (s) 的路径,使得图中所有点到此路径距离的最大值最小,图中边权非负 若想将此题转化到树网的核,需要证明 对于任意一条不在直

    2024年02月05日
    浏览(25)
  • leetcode:2011. 执行操作后的变量值(python3解法)

    存在一种仅支持 4 种操作和 1 个变量  X  的编程语言: ++X  和  X++  使变量  X  的值  加   1 --X  和  X--  使变量  X  的值  减   1 最初, X  的值是  0 给你一个字符串数组  operations  ,这是由操作组成的一个列表,返回执行所有操作后,   X  的  最终值  。 示例 1:

    2024年02月11日
    浏览(27)
  • 如果读了我2011年求职前端开发的酸爽经历,希望你可以鼓起勇气继续向前

    今年是2023年,如果你觉得今年 找工作很难 ,狗哥回忆了一下2011年 求职前端开发 工作的酸爽经历, 希望你 读了以后可以 鼓起勇气 ,不要迷茫,简历投出去石沉大海的,需要改简历的就赶紧改,刷题不到位的就赶紧刷,简历不会改的找狗哥。 目录 1. 从2010到2011年底 2. 裸

    2024年02月03日
    浏览(30)
  • torch之optimizer.step() 与 scheduler.step() 的用法

      首先需要明确optimzier优化器的作用, 形象地来说,优化器就是需要根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用,这也是机器学习里面最一般的方法论。   optimizer.step()通常用在每个mini-batch之中,可以根据具体的需求来做。只有用了

    2024年02月16日
    浏览(33)
  • Step by Step使用wxFormBuilder设计用户图形界面并集成入PyCharm

    wxFormBuilder (简称wxFB)是一个可以用于多种编程语言的图形用户界面设计工具。使用它可以方便的生成Pyhton,C++,PHP的源码文件。此处描述如何设计一个简单的用户输入界面,并将它集成入基于PyCharm IDE的Python项目中。 wxFormBuilder的界面如下: 其中 项目树 :包含所有用到的控

    2024年02月04日
    浏览(32)
  • 【博客692】grafana如何解决step动态变化时可能出现range duration小于step

    grafana本身是没有提供step参数的,因为仪表盘根据查询数据区间以及仪表盘线条宽度等,对于不同查询,相同的step并不能很好的发挥作用,所以step是动态计算的 所以在Grafana中并没有直接提供step参数,而是这两个参数:min step和resolution min step: min step故名思义设定的是step的

    2024年02月13日
    浏览(29)
  • 「Unity入门」Step by step的太空清理垃圾游戏Part 4: 触碰收集垃圾

    配合视频食用效果更好哦~ Step by step的太空垃圾清理游戏教程-Part 4 作为太空环境保护者,除了控制飞船移动外,我们还可以切换前视镜和后视镜。在前视镜状态下,驾驶员需要驾驶飞船碰撞垃圾来收集它;在后视镜的状态下,驾驶员只需要点击垃圾,垃圾就会自动被收集。

    2024年01月25日
    浏览(33)
  • 2011年认证杯SPSSPRO杯数学建模B题(第二阶段)生物多样性的评估全过程文档及程序

    原题再现:    2010 年是联合国大会确定的国际生物多样性年。保护地球上的生物多样性已经越来越被人类社会所关注,相关的大规模科研和考察计划也层出不穷。为了更好地建立国际交流与专家间的合作,联合国还建立了生物多样性和生态系统服务政府间科学政策平台(

    2024年04月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包