首页 > 其他分享 >线段树水题集合

线段树水题集合

时间:2024-08-12 19:50:09浏览次数:6  
标签:pr rs 线段 mid 树水题 ls 集合 ll pl

用的都是《算法竞赛》的码风哦

洛谷P3870

极简 ,开和关用 1 0 表示 ,然后区间修改,区间求和,裸题

洛谷P2846

这两道题一模一样

#include <bits/stdc++.h>
using namespace std;
const int N=100005;
#define ll long long
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
ll n,m,sum[N<<2];
bool tag[N<<2];
void addtag(ll p,ll pl,ll pr){
	sum[p]=pr-pl+1-sum[p];
	tag[p]=!tag[p];
}
void pushdown(ll p,ll pl,ll pr){
	if(tag[p]){
		ll mid=(pl+pr)>>1;
		addtag(ls(p),pl,mid);
		addtag(rs(p),mid+1,pr);
		tag[p]=!tag[p];
	}
}
void pushup(ll p){
	sum[p]=sum[ls(p)]+sum[rs(p)];
}
void update(ll p,ll L,ll R,ll pl,ll pr){
	if(L<=pl&&R>=pr){
		addtag(p,pl,pr);
		return;
	} 
	pushdown(p,pl,pr);
	ll mid=(pl+pr)>>1;
	if(L<=mid)update(ls(p),L,R,pl,mid);
	if(R>mid)update(rs(p),L,R,mid+1,pr);
	pushup(p);
}
ll query(ll p,ll L,ll R,ll pl,ll pr){
	if(L<=pl&&R>=pr){
		return sum[p];
	} 
	pushdown(p,pl,pr);
	ll res=0;
	ll mid=(pl+pr)>>1;
	if(L<=mid)res+=query(ls(p),L,R,pl,mid);
	if(R>mid)res+=query(rs(p),L,R,mid+1,pr);
	return res;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int c,a,b;
		cin>>c>>a>>b;
		if(c){
			cout<<query(1,a,b,1,n)<<endl;
		}else{
			update(1,a,b,1,n);
		}
	}
	return 0;
}

洛谷P6492

sum[]表示这个区间中最长的满足要求的连续子串的长度 suml[]表示这个区间中前缀满足要求的连续子串的长度
sumr[]表示这个区间中后缀满足要求的连续子串的长度

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
const int N=200005;
bool a[N];
ll n,q;
ll sum[N<<2],suml[N<<2],sumr[N<<2];
void build(ll p,ll pl,ll pr){
	sum[p]=suml[p]=sumr[p]=1;
	if(pl==pr)return;
	ll mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
}
void pushup(ll p,ll pl,ll pr){
	ll mid=(pl+pr)>>1;
	ll L=mid-pl+1,R=pr-mid;
	sum[p]=max(sum[ls(p)],sum[rs(p)]);
	suml[p]=suml[ls(p)],sumr[p]=sumr[rs(p)];
	if(a[mid]!=a[mid+1]){
		sum[p]=max(sum[p],sumr[ls(p)]+suml[rs(p)]);
		if(suml[ls(p)]==L)suml[p]=L+suml[rs(p)];
		if(sumr[rs(p)]==R)sumr[p]=R+sumr[ls(p)];
	} 
}
void update(ll p,ll x,ll pl,ll pr){
	if(pl==pr&&pl==x){
		a[pl]=!a[pl];
		return;
	}
	ll mid=(pl+pr)>>1;
	if(x<=mid)update(ls(p),x,pl,mid);
	else update(rs(p),x,mid+1,pr);
	pushup(p,pl,pr);
}
int main(){
	cin>>n>>q;
	build(1,1,n);
	for(int i=1;i<=q;i++){
		ll x;
		cin>>x;
		update(1,x,1,n);
		cout<<sum[1]<<endl;
	}
	return 0;
}

更新ing

标签:pr,rs,线段,mid,树水题,ls,集合,ll,pl
From: https://www.cnblogs.com/Z-kazuha/p/18355617

相关文章

  • windows C++-使用 C++/WinRT 的集合
    在内部,Windows运行时集合具有大量复杂的移动部件。但要将集合对象传递到Windows运行时函数,或要实现自己的集合属性和集合类型时,C++/WinRT中有函数和基类可以提供支持。这些功能消除复杂性,并节省大量时间和精力上的开销。IVector是由元素的任意随机访问集合实现的Windo......
  • 洛谷 P4556 雨天的尾巴之线段树合并模板
    洛谷P4556题解传送锚点摸鱼环节[Vani有约会]雨天的尾巴/【模板】线段树合并题目背景深绘里一直很讨厌雨天。灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以......
  • zkw线段树
    介绍非递归线段树实现方法,码量较短。zkw线段树的构造原理:普通线段树采用堆存储,zkw线段树本质上是满二叉树(若没有该区间则为空点)但根据实际情况,原区间不一定构成满二叉树,据查询方式限制,空间开到最接近的\(2^n\)(据性质树值域=底层节点数),即不存在的点有虚点填充。既然不......
  • 基于 JavaFx 搭建的实用小工具集合
    大家好,我是Java陈序员。作为一名后端程序员,常常需要在电脑上安装各种工具软件来支持日常开发。那么,是否有一款工具集合,包含各种工具,可以省去一一安装呢?答案是有的!今天,给大家介绍一个基于JavaFx实现的工具集合,包含了各式各样的开发工具,以及一些有趣的小工具。关注微信公众......
  • LinkedList模拟栈数据结构的集合,并测试
    packagecom.shujia.day13;importjava.util.LinkedList;/*LinkedList请用LinkedList模拟栈数据结构的集合,并测试栈:先进后出题目的要求是:自己创建一个类,将LinkedList作为成员变量,将来创建自己的类对象,使用自己的方法,但是底层用的是LinkedList中的方法......
  • 关于区间加区间查线段树的标记永久化
    单点加区间查的线段树,每个线段树区间的值代表所维护序列在这个区间的总和;区间加单点查的线段树,每个线段树区间的值代表对这个区间总体加了多少。区间加区间查的线段树可以通过综合两种思想实现标记的永久化。线段树将每一个修改或查询区间拆分为\(O(\logw)\)个线段树区间,只要......
  • 李超线段树
    P4097【模板】李超线段树/[HEOI2013]Segment-洛谷|计算机科学教育新生态(luogu.com.cn)要求在平面直角坐标系下维护两个操作:在平面上加入一条线段。记第\(i\)条被插入的线段的标号为\(i\)。给定一个数\(k\),询问与直线\(x=k\)相交的线段中,交点纵坐标最大的线......
  • ArrayList集合及例题 day12
    packagecom.shujia.day13;importjava.util.ArrayList;importjava.util.Iterator;/*Collection:-List(有序【指的是存储和取出的顺序是一致的】且可以发生重复,且有索引的概念)-ArrayList:底层数据结构是数组,查询快,增删慢,线程不安......
  • 线段树:线段树的定义和应用
    引言线段树是一种高级数据结构,用于解决区间查询和更新问题。它在许多应用中都有广泛的使用,例如数组区间的求和、最小值/最大值查询、区间的最小公倍数/最大公约数查询等。本文将详细介绍线段树的定义、构建、应用以及代码实现。目录线段树的定义线段树的应用线段树的构建......
  • 集合的框架(之一)
    集合的含义:集合是一个可变的容器,可以随时向集合中添加元素,也可以随时从集合中删除元素。另外,集合还提供了若干个用来操作集合中数据的方法。集合里的数据,我们称之为元素(elements);集合只能用来存储引用类型的数据,不能存储八大基本数据类型的数据。泛型JavaSE5.0以后,可以......