首页 > 其他分享 >F - Vacation Query

F - Vacation Query

时间:2023-10-01 17:24:36浏览次数:56  
标签:lc int tr Vacation mid swap rc Query

F - Vacation Query

此题与4301 Can you answer on these queries III类似
只不过要维护0和1两个值
解法:
区间修改和查询,可以利用线段树
1.两区间合并的答案,要么lc(左子树)中,要么在rc(右子树)中,但是也有可能出现在(lc的右端点连续的1加上rc左端点连续的1),所以要多维护两个数据lmx(左端点的最大连续1),rmx(右端点的最大连续1);

2.对于修改操作,我们发现其实是把区间内0,1反转了,所以我们可以利用二维数组分别维护0,1的ans,lmx,rmx,修改时直接交换就好

总结:一道很经典的模板题

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 5e5 + 10;
int a[N];

//线段树
#define lc k<<1
#define rc k<<1|1
struct tree {
	int l, r;
	int ans[2],lmx[2],rmx[2];
	int lz;
}tr[N*4];
void pushup(tree& u, tree ll, tree rr) {//合并区间
	//ans
	u.ans[0] = max(ll.ans[0], max(rr.ans[0], ll.rmx[0] + rr.lmx[0]));
	u.ans[1] = max(ll.ans[1], max(rr.ans[1], ll.rmx[1] + rr.lmx[1]));
	//lmx
	u.lmx[0] = ll.lmx[0];
	if (ll.lmx[0] == (ll.r - ll.l + 1)) u.lmx[0] += rr.lmx[0];
	u.lmx[1] = ll.lmx[1];
	if (ll.lmx[1] == (ll.r - ll.l + 1)) u.lmx[1] += rr.lmx[1];
	//rmx
	u.rmx[0] = rr.rmx[0];
	if (rr.rmx[0] == (rr.r - rr.l + 1)) u.rmx[0] += ll.rmx[0];
	u.rmx[1] = rr.rmx[1];
	if (rr.rmx[1] == (rr.r - rr.l + 1)) u.rmx[1] += ll.rmx[1];
}
void build(int k, int l, int r) {
	tr[k] = { l,r };
	if (l == r) {
		if (a[l] == 0) {
			tr[k].rmx[0]=tr[k].lmx[0]=tr[k].ans[0] = 1;
		}
		else {
			tr[k].rmx[1] = tr[k].lmx[1] = tr[k].ans[1] = 1;
		}
		return;
	}
	int mid = l + r >> 1;
	build(lc, l, mid); build(rc, mid + 1, r);
	pushup(tr[k],tr[lc],tr[rc]);
}
void swap_(int k) {
	swap(tr[k].ans[0], tr[k].ans[1]);
	swap(tr[k].lmx[0], tr[k].lmx[1]);
	swap(tr[k].rmx[0], tr[k].rmx[1]);
}
void pushdown(int k) {
	if (tr[k].lz) {
		swap_(lc), swap_(rc);
		tr[lc].lz ^= 1;
		tr[rc].lz ^= 1;
		tr[k].lz ^= 1;
	}
}
void modify(int k, int l, int r) {//区间修改
	if (tr[k].l >= l && tr[k].r <= r) {
		swap_(k);//相当于维护的01交换了
		tr[k].lz ^= 1;//懒标记
		return;
	}
	pushdown(k);
	int mid = tr[k].l + tr[k].r >> 1;
	if (l <= mid) modify(lc, l, r);
	if(r>mid) modify(rc, l, r);//千万不要写成单点修改
	pushup(tr[k], tr[lc], tr[rc]);
}

tree query(int k, int l, int r) {
	if (tr[k].l >= l && tr[k].r <= r) return tr[k];
	pushdown(k);
	int mid = tr[k].l + tr[k].r >> 1;
	if (mid >= r) return query(lc, l, r);
	if (mid < l) return query(rc, l, r);
	tree T;//临时变量
	pushup(T, query(lc, l, mid), query(rc, mid+1, r));//区间合并
	return T;
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	int n, q;
	cin >> n >> q;
	string s;
	cin >> s;
	for (int i = 1; i <= n; i++) a[i] = s[i-1] - '0';
	build(1, 1, n);
	while (q--) {
		int op,l,r;
		cin >> op>>l>>r;
		if (op == 1) {
			modify(1, l, r);
		}
		else {
			cout << query(1, l, r).ans[1]<< '\n';
		}
	}
	return 0;
}

标签:lc,int,tr,Vacation,mid,swap,rc,Query
From: https://www.cnblogs.com/bu-fan/p/17739012.html

相关文章

  • jQuery中hide()和display的区别在于它们实现元素隐藏的方式不同。
    1.hide()方法是jQuery提供的一个函数,用于隐藏元素。当使用hide()方法时,元素会被设置为display:none,即不显示在页面上,但仍然占据着原来的空间。隐藏后的元素可以通过调用show()方法来重新显示。示例代码:$("#elementId").hide();//隐藏元素$("#elementId").show();//显示......
  • [ABC256Ex] I like Query Problem
    原题传送门题意区间整除,区间推平,查询区间和。大家好啊,我喜欢暴力乱搞,所以这题我用暴力乱搞AC了。首先观察到操作\(1\)的性质:首先保证了除数至少为\(2\)(不然是\(1\)或者\(0\)的话也没啥意义啊),所以对一个数不断进行操作的话,每次数的大小至少会减少一半,减小到\(0\)之......
  • 你没有看错,爬网页数据,C# 也可以像 Jquery 那样
    一:背景1.讲故事前段时间搞了一个地方性民生资讯号,资讯嘛,都是我抄你的,你抄官媒的,小市民都喜欢奇闻异事,所以就存在一个需求,如何去定向抓取奇闻异事的地方号上的新闻,其实做起来很简单,用逻辑回归即可,这篇主要讨论如何去抓取,在C#中大家都知道抓取通用的库是HtmlAgilityPack,但是这个......
  • 在Koa2中,ctx.request.body和ctx.query的主要区别
    在Koa2中,ctx.request.body和ctx.query的主要区别在于获取参数的位置不同。ctx.query用于获取URL查询参数,而ctx.request.body用于获取请求体中的参数。下面是详细的区别和示例代码。获取URL查询参数URL查询参数是指在URL中以?开头,&连接的键值对参数。例如,以下URL中的查询参数为nam......
  • jquery相关总结
    JQuery使用技巧总结作者:未知一、简介1.1、概述随着WEB2.0及ajax思想在互联网上的快速发展传播,陆续出现了一些优秀的Js框架,其中比较著名的有Prototype、YUI、jQuery、mootools、Bindows以及国内的JSVM框架等,通过将这些JS框架应用到我们的项目中能够使......
  • 185_技巧_Power Query(M)语言快捷输入之搜狗输入法设置自定义短语
    185_技巧_PowerQuery(M)语言快捷输入之搜狗输入法设置自定义短语此前,我们发布过如何通过QQ拼音输入法来实现快速的输入PowerQuery(M)语言。参考:https://jiaopengzi.com/730.html今天我们来更新PowerQuery(M)语言在搜狗输入法中设置自定义短语的快捷输入。快捷输入效......
  • 利用jQuery实现表格或者区域内数据的滚动展示效果
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • 基于jquery开发的Windows 12网页版
    预览https://win12.gitapp.cn首页代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="refresh"content="0;url=desktop.html"/><metaname=&q......
  • Jquery
    1.jquery就是一个js库2.jquery这个库向外暴露了jQuery或者$()这个函数。3.得到一个jquery对象letobj=$('#id')4.$()此时$代表函数,$.each()此时$代表对象。参数是选择器字符串返回一个jquery对象。注意只有jquery对象才能够调用val()...html()的jquery方法。5.jquery对象里面包含......
  • 根据周数计算月(Power Query)
    问题:如何根据周数计算月假设:以每周第一天为标准,一周从周一开始计let源=Excel.CurrentWorkbook(){[Name="表1"]}[Content],当前年=Table.AddColumn(源,"23年",eachDate.Month(Date.AddDays(#date([年],1,1),[周]*7-7))),通用年=Table.AddColumn(当前年,......