首页 > 其他分享 >AtCoder——第一题

AtCoder——第一题

时间:2023-10-02 17:44:55浏览次数:37  
标签:AtCoder right r0 r1 第一 sum l0 left

AtCoder Beginner Contest 322 F Vacation Query

题目大意

处理01字符串,给定Q次询问,询问区间内最长连续1的字符个数

题目理解

  • 使用线段树维护区间
  • 需要使用懒标记下传修改信号
  • 线段树要维护7个信息(区间的最长连续1的个数、区间左端点开始连续1的个数、区间左端点开始连续0的个数、区间的连续0的个数、区间右端点开始连续1的个数、区间右端点开始连续0的个数、区间总字符数)
  • pushup操作
  • pushdown操作

AC代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 500010;

struct Node
{
	int l, r;
	int l1, r1, m1, sum, m0, l0, r0; 
	int tag=0; // 懒标记
	// l1:左端点开始连续1的个数,r1:右端点连续1的个数,m1:最长1子串的长度
	// sum:子串字符个数
	// l0:左端点开始连续0的个数,r0:右端点连续0的个数,m0:最长0子串的长度
	
	// 方便query时直接返回,重载了加号
	Node operator+ (const Node &b) const
	{
		Node u;
		u.sum = sum + b.sum;
		u.l1 = l1 + (l1 == sum ? b.l1 : 0);
		u.l0 = l0 + (l0 == sum ? b.l0 : 0);
		u.r1 = b.r1 + (b.r1 == b.sum ? r1 : 0);
		u.r0 = b.r0 + (b.r0 == b.sum ? r0 : 0);
		u.m1 = max(r1 + b.l1, max(m1, b.m1));
		u.m0 = max(r0 + b.l0, max(m0, b.m0));
		return u;
	}
	
} tr[4 * N];
int n, m;
string s;

void pushup(Node &u, Node &left, Node &right)
{
	u.sum = left.sum + right.sum;
	u.l1 = left.l1 + (left.l1 == left.sum ? right.l1 : 0);
	u.l0 = left.l0 + (left.l0 == left.sum ? right.l0 : 0);
	u.r1 = right.r1 + (right.r1 == right.sum ? left.r1 : 0);
	u.r0 = right.r0 + (right.r0 == right.sum ? left.r0 : 0);
	u.m1 = max(left.r1 + right.l1, max(left.m1, right.m1));
	u.m0 = max(left.r0 + right.l0, max(left.m0, right.m0));
}

void pushup(int u)
{
	pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}

void push(Node &p)
{
	p.tag = !p.tag;
	swap(p.l0, p.l1);
	swap(p.r0, p.r1);
	swap(p.m0, p.m1);
}

void push_down(int u)
{
	if (tr[u].tag)
	{
		push(tr[u << 1]);
		push(tr[u << 1 | 1]);
		tr[u].tag = 0;
	}
}

void build(int u, int l, int r)
{
	if (l == r) 
	{
		tr[u].l = tr[u].r = l;
		tr[u].l0 = tr[u].r0 = tr[u].m0 = (s[l - 1] == '0');
		tr[u].l1 = tr[u].r1 = tr[u].m1 = (s[l - 1] == '1');
		tr[u].sum = 1;
	}
	else
	{
		tr[u] = {l, r};
		int mid = (l + r) >> 1;
		build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
		pushup(u);
	}
}

void modify(int u, int l, int r)
{
	if (tr[u].l >= l && tr[u].r <= r)
	{
		push(tr[u]);
	}
	else
	{
		push_down(u);
		int mid = (tr[u].l + tr[u].r) >> 1;
		if (l <= mid) modify(u << 1, l, r);
		if (r > mid) modify(u << 1 | 1, l, r);
		pushup(u); 
	}
}

Node query(int u, int l, int r)
{
	if (tr[u].l >= l && tr[u].r <= r)
	{
		return tr[u];
	}
	push_down(u);
	int mid = (tr[u].l + tr[u].r) >> 1;

	if (l <= mid) 
	{
		if (mid >= r) return query(u << 1, l, r);
		return query(u << 1, l, r) + query(u << 1 | 1, l, r);
	}
	return query(u << 1 | 1, l, r);
}

void solve()
{
	cin >> n >> m;
	cin >> s;
	
	build(1, 1, n);
	
	while (m--)
	{
		int op, l, r;
		cin >> op >> l >> r;
		if (op == 1)
		{
			modify(1, l, r);
		}
		else
		{
			cout << query(1, l, r).m1 << '\n';
		}
	}
}

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T = 1;
	while (T--)
	{
		solve();
	}
	return 0;
}

标签:AtCoder,right,r0,r1,第一,sum,l0,left
From: https://www.cnblogs.com/yhgm/p/17740267.html

相关文章

  • 第一周 安装rocky 8.5
    1、下载RockyLinux官方镜像8.5  1.1打开网址直接下载http://dl.rockylinux.org/vault/rocky/8.5/isos/x86_64/Rocky-8.5-x86_64-dvd1.iso2.创建虚拟机导入iso文件,进入RockyLinux的初始安装界面,选择installRockyLinux8后,按下回车键enter,开始安装RockyLinux。  ......
  • 2023-2024 20231313《计算机基础与程序设计》第一周学习总结
    2023-202420231313《计算机基础与程序设计》第一周学习总结目录作业信息学习内容概括学习方法教材中的问题或感悟《计算机科学概论》第一章《全景图》第二章《二进制数值与计数系统》第三章《数据表示法》第四章《门和电路》第五章《计算部件》第六章《低级程序设计语言与伪代......
  • 2023-2024-1 20231404《计算机基础与程序设计》第一周学习总结
    作业信息1.作业属于哪个课程:https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP2.这个作业要求在哪里:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP/homework/127543.作业的目标:快速浏览教材《计算机科学概论》,提出自己不懂或最想解决的问题4.作业正文:2023-20......
  • AtCoder Grand Contest 056 D Subset Sum Game
    洛谷传送门AtCoder传送门考虑若\(n\)是奇数怎么做。枚举Alice第一次选的数\(a_i\),然后考虑把剩下的数两两结成一个匹配,若Bob选了其中一个,Alice就选另一个。容易发现排序后奇数位和它右边的偶数位匹配最优。那么设奇数位的和为\(A\),偶数位的和为\(B\),此时Alice获胜......
  • 2023-2024-1 20231411 《计算机基础与程序设计》第一周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第一周作业这个作业的目标初步熟悉课本以及对所学内容有所思考作业正文本博客教材学习内容总结本书涉及计算机科学的方方面面,介绍了计......
  • 2023-2024-1 20231426 《计算机基础与程序设计》第一周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第一周作业这个作业的目标初步熟悉课本以及对所学内容有所思考作业正文本博客教材学习内容总结本书涉及计算机科学的方方面面,介绍了计......
  • 2023-2024-1 20231301 《计算机基础与程序设计》第一周学习总结
    作业信息课程计算机基础与程序设计要求https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP目标快速学习计算机科学概论这本书,有一个初步的了解正文https://www.cnblogs.com/czzz567/p/17728636.html教材内容总结学习计算机科学概论教材学习中的问题......
  • 2023-2024-1 20231323《计算机基础与程序设计》第一周学习总结
    2023-2024-120231323《计算机基础与程序设计》第1周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01这个作业的目标快速浏览教材《计算机......
  • 2023-2024-1 20231425《计算机基础与程序设计》第一周学习总结
    教材学习中的问题和解决过程第一章问题1:计算系统的分层的部分要如何交互合作?问题2:芯片对于计算机的重要性?为什么特殊场合一定要用国产芯片,不法分子如何通过硬件层面窃取信息?第二章问题1:是否还存在其它进制的计算机?(之前听说过以abcdefg代替10~16的16进制的科普)问题2:如何用二......
  • 2023-2024-1 20231408 《计算机基础与程序设计》第一周学习总结
    2023-2024-120231408《计算机基础与程序设计》第一周学习总结作业信息这个作业属于哪个课程<2023-2024-1-计算机基础与程序设计>这个作业要求在哪里<2023-2024-1计算机基础与程序设计第一周作业>这个作业的目标<快速浏览一遍《计算机科学概论》并提出自己的疑问......