《P6492 [COCI 2010/2011 #6] STEP》

题目描述

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

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

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

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1复制

6 2
2
4

输出 #1复制

3
5

输入 #2复制

6 5
4
1
1
2
6

输出 #2复制

3
3
3
5
6

说明/提示

数据规模与约定

对于全部的测试点,保证 1≤n,q≤2×105,1≤x≤n。

说明

题目译自 COCI2010-2011 CONTEST #6 T5 STEP,翻译来自 @一扶苏一。

代码实现:

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

const int MAXN = 200005;

struct SegmentNode {
    int left_val;      // 左端点的值
    int right_val;     // 右端点的值
    int left_max_len;  // 左端连续相同值的最大长度
    int right_max_len; // 右端连续相同值的最大长度
    int max_len;       // 区间内连续相同值的最大长度
    int interval_len;  // 区间长度
};

SegmentNode tree[MAXN << 2];
int n, q; // q代替m表示查询次数

// 合并子节点信息到父节点
void merge(int node) {
    int left_child = node << 1;
    int right_child = node << 1 | 1;
    
    tree[node].left_val = tree[left_child].left_val;
    tree[node].right_val = tree[right_child].right_val;
    
    tree[node].left_max_len = tree[left_child].left_max_len;
    tree[node].right_max_len = tree[right_child].right_max_len;
    
    tree[node].max_len = max(tree[left_child].max_len, tree[right_child].max_len);
    
    if (tree[left_child].right_val != tree[right_child].left_val) {
        tree[node].max_len = max(tree[node].max_len, tree[left_child].right_max_len + tree[right_child].left_max_len);
        
        if (tree[left_child].max_len == tree[left_child].interval_len) {
            tree[node].left_max_len += tree[right_child].left_max_len;
        }
        
        if (tree[right_child].max_len == tree[right_child].interval_len) {
            tree[node].right_max_len += tree[left_child].right_max_len;
        }
    }
}

// 构建线段树
void build(int left, int right, int node) {
    tree[node].interval_len = right - left + 1;
    
    if (left == right) {
        tree[node].left_val = 1;
        tree[node].right_val = 1;
        tree[node].left_max_len = 1;
        tree[node].right_max_len = 1;
        tree[node].max_len = 1;
        return;
    }
    
    int mid = (left + right) / 2;
    build(left, mid, left_child);
    build(mid + 1, right, right_child);
    merge(node);
}

// 单点更新
void update(int pos, int left, int right, int node) {
    if (left == right) {
        tree[node].left_val ^= 1;
        tree[node].right_val = tree[node].left_val;
        return;
    }
    
    int mid = (left + right) / 2;
    if (pos <= mid) update(pos, left, mid, left_child);
    else update(pos, mid + 1, right, right_child);
    
    merge(node);
}

int main() {
    scanf("%d %d", &n, &q);
    build(1, n, 1);
    
    int x;
    while (q--) {
        scanf("%d", &x);
        update(x, 1, n, 1);
        printf("%d\n", max(tree[1].max_len, max(tree[1].left_max_len, tree[1].right_max_len)));
    }
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912207.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macOS,切换 space 失效,向右切换space(move right a space) 失效

背景 准确来讲&#xff0c;遇到的问题是向右切换space&#xff08;move right a space) 失效&#xff0c;并向左是成功的。 在键盘-快捷键-调度中心中&#xff0c;所有的快捷键均可用&#xff0c;但是“向右移动一个空间”总是失效。 已经检查过不是快捷键冲突的问题&#x…

网飞猫官网入口 - 免费高清影视平台,Netflix一站观看

网飞猫是一个专注于提供丰富影视资源的在线平台&#xff0c;涵盖国内外热门电影、电视剧、动漫、综艺等多种类型。它不仅整合了Netflix的独家内容&#xff0c;还提供了大量高清、蓝光画质的影视作品&#xff0c;支持多语言字幕&#xff0c;满足不同用户的观影需求。网飞猫的界面…

Hyper-v-中的FnOs--飞牛Nas虚拟磁盘扩容(不清除数据)

在Hyper-v下的飞牛Nas要怎么在不删除原有虚拟磁盘数据的情况下扩容呢 OK下面开始教学&#xff08;适用于Basic模式的虚拟磁盘扩容&#xff0c;Linear没试过&#xff09; 先关闭飞牛Nas系统 找到飞牛Nas虚拟机&#xff0c;在设置下SCSI控制器找到要扩容的虚拟磁盘&#xff0c; 点…

掌握 MySQL 的基石:全面解读数据类型及其影响

前言 上篇文章小编讲述了关于MySQL表的DDL操作&#xff0c;在那里我多次使用了MySQL的数据类型&#xff0c;但是我并没有去讲述MySQL的数据类型&#xff0c;想必各位读者已经很好奇MySQL的数据类型都有什么了&#xff0c;今天这篇文章我将会详细的去讲述MySQL的数据类型&#x…

buildadmin 如何制作自己的插件

官方文档指引 提示&#xff1a;若不计划发布到应用市场&#xff0c;可省略图片等非必要功能 参考文档&#xff1a;https://doc.buildadmin.com/senior/module/basicInfo.html 目录 官方文档指引开发说明模块开发流程模块包结构示例安装开发工具 总结 开发说明 目标&#xff…

【数据标注师】关键点标注

目录 一、 **关键点标注的四大核心原则**二、 **五阶能力培养体系**▶ **阶段1&#xff1a;基础认知筑基&#xff08;1-2周&#xff09;**▶ **阶段2&#xff1a;复杂场景处理技能▶ **阶段3&#xff1a;三维空间标注&#xff08;进阶&#xff09;**▶ **阶段4&#xff1a;效率…

创建网站的基本步骤?如何建设自己的网站?

创建网站是一个系统化的过程&#xff0c;涵盖规划、设计、开发、测试和发布等多个阶段。以下是详细步骤及关键工具推荐&#xff1a; 一、规划阶段&#xff1a;明确目标与内容 定义目标 1、确定网站目的&#xff08;展示信息、销售、博客、服务等&#xff09;。 2、分析目标…

FreeSWITCH配置文件解析(2) dialplan 拨号计划中xml 的action解析

在 FreeSWITCH 的拨号计划&#xff08;Dialplan&#xff09;中&#xff0c;使用 XML 配置。其中&#xff0c;<action> 标签用于指定要执行的操作。这些操作通常是应用程序&#xff08;applications&#xff09;或设置变量等。下面列出常见的 <action> 类型及其含义…

MCPA2APPT:基于 A2A+MCP+ADK 的多智能体流式并发高质量 PPT 智能生成系统

&#x1f680; MCPA2APPT / MultiAgentPPT 集成 A2A MCP ADK 架构的智能化演示文稿生成系统&#xff0c;支持多智能体协作与流式并发&#xff0c;实时生成高质量 PPT 内容。 &#x1f9e0; 项目简介 MultiAgentPPT&#xff08;又名 MCPA2APPT&#xff09;采用 A2A&#xff…

Maven 多模块项目调试与问题排查总结

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

debian国内安装docker

先升级apt和安装依赖包 apt update apt upgrade apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates添加存储库的GPG密钥&#xff08;阿里云&#xff09; curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg…

vue网页中的一个天气组件使用高德api

今天写了一个天气组件效果如下&#xff1a; 实现代码如下&#xff1a; <template><div><span click"getLocation" style"cursor: pointer"><span style"color:white;">{{ weatherInfo.area }}</span></span&g…

5 手写卷积函数

5 手写卷积函数 背景介绍滑动窗口的方式代码问题 矩阵乘法的方式原理代码结果 效果对比对比代码日志结果 一些思考 背景 从现在开始各种手写篇章&#xff0c;先从最经典的卷积开始 介绍 对于卷积层的具体操作&#xff0c;我这里就不在具体说卷积具体是什么东西了。 对于手写…

vue3+element-plus,实现两个表格同步滚动

需求&#xff1a;现在需要两个表格&#xff0c;为了方便对比左右的数据&#xff0c;需要其中一边的表格滚动时&#xff0c;另一边的表格也跟着一起滚动&#xff0c;并且保持滚动位置的一致性。具体如下图所示。 实现步骤&#xff1a; 确保两个表格的宽度一致&#xff1a;如果两…

Mysql架构

思考&#xff1a;Mysql需要重点学习什么&#xff1a; 索引&#xff1a;索引存储结构、索引优化......事务&#xff1a;锁机制与隔离级别、日志、集群架构 本文是对Mysql架构进行初步学习 1、Mysql链接 Mysql监听器是长连接 BIO(阻塞同步IO调用)&#xff0c; 不是NIO. 为什么…

使用deepseek制作“喝什么奶茶”随机抽签小网页

教程很简单&#xff0c;如下操作 1. 新建文本文档&#xff0c;命名为奶茶.txt 2. 打开deepseek&#xff0c;发送下面这段提示词&#xff1a;用html5帮我生成一个喝什么奶茶的网页&#xff0c;点击按钮随机生成奶茶品牌等&#xff0c;包括喜茶等众多常见的奶茶品牌如果不满意还…

WOE值:风险建模中的“证据权重”量化术——从似然比理论到FICO评分卡实践

WOE值&#xff08;Weight of Evidence&#xff0c;证据权重&#xff09; 是信用评分和风险建模中用于量化特征分箱对目标变量的预测能力的核心指标。 本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关…

js递归性能优化

JavaScript 递归性能优化 递归是编程中强大的技术&#xff0c;但在 JavaScript 中如果不注意优化可能会导致性能问题甚至栈溢出。以下是几种优化递归性能的方法&#xff1a; 1. 尾调用优化 (Tail Call Optimization, TCO) ES6 引入了尾调用优化&#xff0c;但只在严格模式下…

vue界面增加自定义水印 js

vue整个界面增加自定义水印 需求&#xff1a;领导想要增加自定义水印 好不容易调完&#xff0c;还是想记录一下,在.vue界面编写 export default {mounted() {this.$nextTick(() > {this.addWatermark()})},methods: {// 关键&#xff1a;添加水印// 动态添加水印addWaterm…

Go开发工程师-Golang基础知识篇

开篇 我们尝试从2个方面来进行介绍&#xff1a; 1. 社招实际面试问题 2. 问题涉及的基础点梳理 社招面试题 米哈游 1. Go 里面使用 Map 时应注意问题和数据结构 2. Map 扩容是怎么做的&#xff1f; 3. Map 的 panic 能被 recover 掉吗&#xff1f;了解 panic 和 recover …