首页 > 其他分享 >【做题记录】2025刷题计划--线段树

【做题记录】2025刷题计划--线段树

时间:2025-01-19 11:21:23浏览次数:1  
标签:return -- res 2025 int dfn il id 刷题

A. 「SDOI2014」旅行
给每个宗教开一棵线段树,树剖 \(+\) 线段树单点修改区间查询即可。

Code
#include<bits/stdc++.h>
#define ll long long
#define il inline
#define read(x){\
	char ch;\
	int fu=1;\
	while(!isdigit(ch=getchar()))\
		fu-=(ch=='-')<<1;\
	x=ch&15;\
	while(isdigit(ch=getchar()))\
		x=(x<<1)+(x<<3)+(ch&15);\
	x*=fu;\
}
#define int ll
#define pb push_back
using namespace std;
namespace asbt{
namespace cplx{bool begin;}
const int maxn=1e5+5,maxm=5e6+5;
int n,m,a[maxn],b[maxn],cnt;
int top[maxn],fa[maxn],dfn[maxn];
int sz[maxn],hes[maxn],dep[maxn];
vector<int> e[maxn];
il void dfs1(int u){
	dep[u]=dep[fa[u]]+1;
	sz[u]=1;
	int mxs=0;
	for(int v:e[u]){
		if(v==fa[u]){
			continue;
		}
		fa[v]=u;
		dfs1(v);
		sz[u]+=sz[v];
		if(mxs<sz[v]){
			mxs=sz[v];
			hes[u]=v;
		}
	}
}
il void dfs2(int u){
	dfn[u]=++cnt;
	if(!top[u]){
		top[u]=u;
	}
	if(hes[u]){
		top[hes[u]]=top[u];
		dfs2(hes[u]);
	}
	for(int v:e[u]){
		if(v==fa[u]||v==hes[u]){
			continue;
		}
		dfs2(v);
	}
}
int rt[maxn],ls[maxm],rs[maxm];
int tot,sum[maxm],mx[maxm];
il void pushup(int id){
	sum[id]=sum[ls[id]]+sum[rs[id]];
	mx[id]=max(mx[ls[id]],mx[rs[id]]);
}
il void upd(int &id,int l,int r,int pos,int val){
	if(!id){
		id=++tot;
	}
	if(l==r){
		sum[id]=mx[id]=val;
		return ;
	}
	int mid=(l+r)>>1;
	if(pos<=mid){
		upd(ls[id],l,mid,pos,val);
	}
	else{
		upd(rs[id],mid+1,r,pos,val);
	}
	pushup(id);
}
il int qsum(int id,int L,int R,int l,int r){
	if(!id){
		return 0;
	}
	if(L>=l&&R<=r){
		return sum[id];
	}
	int mid=(L+R)>>1,res=0;
	if(l<=mid){
		res+=qsum(ls[id],L,mid,l,r);
	}
	if(r>mid){
		res+=qsum(rs[id],mid+1,R,l,r);
	}
	return res;
}
il int qmx(int id,int L,int R,int l,int r){
	if(!id){
		return 0;
	}
	if(L>=l&&R<=r){
		return mx[id];
	}
	int mid=(L+R)>>1,res=0;
	if(l<=mid){
		res=max(res,qmx(ls[id],L,mid,l,r));
	}
	if(r>mid){
		res=max(res,qmx(rs[id],mid+1,R,l,r));
	}
	return res;
}
namespace cplx{
	bool end;
	il double usdmem(){return (&begin-&end)/10485796.0;}
}
signed main(){
	read(n)read(m);
	for(int i=1;i<=n;i++){
		read(a[i])read(b[i]);
	}
	for(int i=1,u,v;i<n;i++){
		read(u)read(v);
		e[u].pb(v),e[v].pb(u);
	}
	dfs1(1),dfs2(1);
	for(int i=1;i<=n;i++){
		upd(rt[b[i]],1,n,dfn[i],a[i]);
	}
	while(m--){
		char opt[5];
		int u,v;
		scanf(" %s",opt+1);
		read(u)read(v);
		switch(opt[2]){
			case 'C':{
				upd(rt[b[u]],1,n,dfn[u],0);
				b[u]=v;
				upd(rt[b[u]],1,n,dfn[u],a[u]);
				break;
			}
			case 'W':{
				a[u]=v;
				upd(rt[b[u]],1,n,dfn[u],a[u]);
				break;
			}
			case 'S':{
				int res=0,x=b[u];
				while(top[u]!=top[v]){
//					puts("666");
					if(dep[top[u]]<dep[top[v]]){
						swap(u,v);
					}
					res+=qsum(rt[x],1,n,dfn[top[u]],dfn[u]);
					u=fa[top[u]];
				}
				if(dep[u]>dep[v]){
					swap(u,v);
				}
				res+=qsum(rt[x],1,n,dfn[u],dfn[v]);
				printf("%lld\n",res);
				break;
			}
			default:{
				int res=0,x=b[u];
				while(top[u]!=top[v]){
					if(dep[top[u]]<dep[top[v]]){
						swap(u,v);
					}
					res=max(res,qmx(rt[x],1,n,dfn[top[u]],dfn[u]));
					u=fa[top[u]];
				}
				if(dep[u]>dep[v]){
					swap(u,v);
				}
				res=max(res,qmx(rt[x],1,n,dfn[u],dfn[v]));
				printf("%lld\n",res);
				break;
			}
		}
	}
	return 0;
}
}
signed main(){return asbt::main();}

标签:return,--,res,2025,int,dfn,il,id,刷题
From: https://www.cnblogs.com/zhangxyhp/p/18679418

相关文章

  • 更始
    紫砂486镇楼。这个和长崎记录帖风格有所差别,因此分离。换一个头像才觉出新年已至。我期待焰火,期待苇叶飘摆的新风我期待余味扫尽而无残留的时代我会笑笑地迎接这一切的到来。一个又一个无所事事的晚上,游荡于“残兵”与随机性之中并且弹奏木贝斯扰民。在假期开始之前,我们也......
  • NOIP 冲刺之——数据结构
    \(\texttt{0x00}\)前言本篇文章主要记录笔者NOIP冲刺阶段复习的各种数据结构题型及tricksanstips,同时也用于及时复习与巩固。那么,开始吧。\(\texttt{0x01}\)树状数组、线段树知识点\(1\):二维偏序众所周知,逆序对可以用归并排序离线求,但是要求在线呢?这时候我们会想到......
  • 为什么说js是弱类型语言,它的优缺点分别是什么?
    JavaScript被认为是弱类型语言,主要是因为它允许变量在不经过强制类型转换的情况下赋予不同数据类型的值。具体来说,在JavaScript中,一个变量可以被赋予数值、字符串、布尔值或对象等不同类型的值,这种灵活性使得JavaScript在编程中带来很大的便利。然而,这种弱类型的特性也带来了一些......
  • 你知道什么是ECMAScript吗?
    ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)通过ECMA-262标准化的脚本程序设计语言。它定义了脚本语言的语法、类型、语句、关键字、保留字、运算符和对象等核心元素,是前端开发领域中的重要基础。以下是对ECMAScript的详细解释:定义与起源:ECMAScript可以理解为Java......
  • 让你手写一个reset的文件,你应该怎么写?要考虑哪些方面呢?
    在前端开发中,一个reset文件通常指的是一个CSS重置文件,其目的是消除浏览器默认样式的不一致性,从而提供一个更一致的起点来构建项目的样式。下面是一个简单的示例,展示了如何手写一个CSS重置文件,并考虑了几个方面:/*reset.css*//*1.移除边距*/body,h1,h2,h3,h4,h5......
  • LeetCode25.K个一组翻转链表
    题目:给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。输入:head=[1,2,3,4,5......
  • 举例说明HTML5的标签meter的用法
    HTML5的<meter>标签用于表示一个范围内的测量值或者一个分数值。这个标签特别适用于表示像磁盘使用量、查询结果的相关性或者产品评分这样的数据。<meter>标签通常用于表示已知范围的测量值,例如0到100。<meter>标签有以下几个重要的属性:value:表示当前的测量值,必须在mi......
  • 在js中函数返回多个值有哪些方法?
    在JavaScript中,函数本身不能直接返回多个值,但可以通过一些技巧和模式来模拟这一行为。以下是一些常见的方法:使用数组:将多个值放入一个数组中,并返回该数组。这是最简单和最常用的方法。functiongetMultipleValues(){return[1,'two',true];}const[value1,value2......
  • 说说你对AMD、CMD和CommonJS的理解
    在前端开发中,AMD、CMD和CommonJS是三种不同的模块规范,它们各自有着独特的特点和适用场景。下面我将分点详细阐述我对这三种模块规范的理解:一、AMD(异步模块定义)AMD是RequireJS在推广过程中对模块定义的规范化产出,主要用于浏览器端。它使用define()函数来定义模块,允许异步加载模......
  • 怎样去除图片自带的边距?
    在前端开发中,去除图片自带的边距可以通过多种方法来实现。以下是一些常见且有效的解决方法:使用CSS样式:将图片的display属性设置为block,这样可以使图片变为块级元素,从而消除行内元素带来的边距问题。设置图片的float属性为left或right,这也可以消除图片周围的默认边距,但需要注......