[SDOI2011] 染色

别再被无限debugger卡住了!Chrome DevTools实战绕过技巧(含Hook与文件替换) 本文详细介绍了如何通过Chrome DevTools绕过无限debugger封锁的实战技巧,包括Hook技术与文件替换方法。针对常见的定时器轰炸、循环陷阱和动态注入等反调试手段,提供了高效的解决方案,帮助开发者快速突破调试障碍,提升爬虫和逆向工程效率。 阅读详情

这道题,显然我们需要树剖一下

然后我们考虑怎么用线段树去维护区间颜色段数

我们会想到我们需要维护这么几个东西

1.区间段数

2.区间左端点的颜色

3.区间右端点的颜色

合并的时候就是左儿子的段数加上右儿子的段数,如果左儿子的右端点和右儿子的左端点是一个颜色,那么就段数-1

因为是区间修改,所以加上一个懒标记就可以了

更新跟普通树剖一样,但是查询不太一样

这里提供一种适用范围更广的做法

我是受到了这道题的启发,那道题是求树上最大子段和,需要维护的东西比较多,所以单纯用变量不太好做。

所以我让我们的 q u e r y query query函数返回的是一个结构体来储存这一段的答案的段数,左端点,右端点分别是什么,然后我们再写一个 m e r g e merge merge函数来合并两个结构体,其实写起来和 p u s h u p pushup pushup差不多,大概是这个样子的

segment_tree merge(segment_tree l,segment_tree r){
	if(!l.sum)return r;
	if(!r.sum)return l;
	segment_tree res;
	res.lcol=l.lcol,res.rcol=r.rcol;
	res.sum=l.sum+r.sum;
	if(l.rcol==r.lcol)res.sum--;
	return res;	
}

那么我们树剖查询的时候,开两个 s e g m e n t _ t r e e segment\_tree segment_tree类型的结构体变量l,r,分别表示x往上跳到他们的lca的这一段的颜色段数和y跳到 l c a lca lca这一段的颜色段数

然后依次合并就可以了

但是注意一点, m e r g e merge merge函数是不满足交换律的,所以我们要把 t o p [ x ] − x top[x]-x top[x]−x这一段放在左边。

最后合并的时候要把l的左端点颜色和右端点颜色交换一下,因为我们要把一个区间整体反转才能接到一起(可以画个图理解一下)

然后如果你只过了hack数据的话就查一下你的查询那一段有没有查反就好了

c o d e   t i m e code \ time code time:

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

# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)
const int N=1e5+5;
template <typename T> void read(T &x){
	x=0;int f=1;
	char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
	for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
	x*=f;
}

int n,m;
int head[N],cnt;
int a[N],_a[N];
int faz[N],son[N],dep[N],siz[N],top[N],dfn[N],tot;

struct Edge{
	int to,next;	
}e[N<<1];

void add(int x,int y){
	e[++cnt]=(Edge){y,head[x]},head[x]=cnt;	
}

struct segment_tree{
	int l,r;
	int lcol,rcol,sum;	
	int tag;
	segment_tree(){l=r=lcol=rcol=sum=tag=0;}
}seg[N<<2];

# define lc (u<<1)
# define rc (u<<1|1)

void pushup(int u){
	seg[u].sum=seg[lc].sum+seg[rc].sum;
	if(seg[lc].rcol==seg[rc].lcol)seg[u].sum--;
	seg[u].lcol=seg[lc].lcol;
	seg[u].rcol=seg[rc].rcol;	
}

void pushdown(int u){
	seg[lc].sum=1;
	seg[lc].lcol=seg[lc].rcol=seg[u].tag;
	seg[lc].tag=seg[u].tag;
	seg[rc].sum=1;
	seg[rc].lcol=seg[rc].rcol=seg[u].tag;
	seg[rc].tag=seg[u].tag;
	seg[u].tag=0;	
}

segment_tree merge(segment_tree l,segment_tree r){
	if(!l.sum)return r;
	if(!r.sum)return l;
	segment_tree res;
	res.lcol=l.lcol,res.rcol=r.rcol;
	res.sum=l.sum+r.sum;
	if(l.rcol==r.lcol)res.sum--;
	return res;	
}

void build(int u,int l,int r){
	seg[u].l=l,seg[u].r=r;
	if(l==r){seg[u].sum=1,seg[u].lcol=seg[u].rcol=_a[l];return;}
	int mid=l+r>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(u);
}

void update(int u,int l,int r,int k){
	if(seg[u].l>=l&&seg[u].r<=r){
		seg[u].sum=1;
		seg[u].lcol=seg[u].rcol=k;
		seg[u].tag=k;
		return;
	}	
	if(seg[u].tag)pushdown(u);
	int mid=seg[u].l+seg[u].r>>1;
	if(l<=mid)update(lc,l,r,k);
	if(r>mid)update(rc,l,r,k);
	pushup(u);
}

segment_tree query(int u,int l,int r){
	if(seg[u].l>=l&&seg[u].r<=r)return seg[u];
	if(seg[u].tag)pushdown(u);
	int mid=seg[u].l+seg[u].r>>1;
	if(r<=mid)return query(lc,l,r);
	if(l>mid)return query(rc,l,r);
	return merge(query(lc,l,r),query(rc,l,r));	
}

void RouteModify(int x,int y,int k){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		update(1,dfn[top[x]],dfn[x],k);
		x=faz[top[x]];	
	}
	if(dep[x]>dep[y])swap(x,y);
	update(1,dfn[x],dfn[y],k);
}

int RouteQuery(int x,int y){
	segment_tree l,r;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]){
			r=merge(query(1,dfn[top[y]],dfn[y]),r);
			y=faz[top[y]];	
		}
		else{
			l=merge(query(1,dfn[top[x]],dfn[x]),l);
			x=faz[top[x]];	
		}
	}
	if(dep[x]<dep[y])r=merge(query(1,dfn[x],dfn[y]),r);
	else l=merge(query(1,dfn[y],dfn[x]),l);
	swap(l.lcol,l.rcol);
	return merge(l,r).sum; 
}

void dfs1(int u,int fa){
	faz[u]=fa;
	siz[u]=1;
	dep[u]=dep[fa]+1;
	RepG(i,u){
		int v=e[i].to;
		if(v==fa)continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]])son[u]=v;
	}
}

void dfs2(int u,int _top){
	top[u]=_top;
	dfn[u]=++tot;
	_a[tot]=a[u];
	if(!son[u])return;
	dfs2(son[u],_top);
	RepG(i,u){
		int v=e[i].to;
		if(v==faz[u]||v==son[u])continue;
		dfs2(v,v);
	}
}

int main()
{
	memset(head,-1,sizeof(head));
	read(n),read(m);
	Rep(i,1,n)read(a[i]);
	Rep(i,1,n-1){
		int x,y;
		read(x),read(y);
		add(x,y),add(y,x);
	}
	dfs1(1,0),dfs2(1,1);
	build(1,1,n);
	Rep(i,1,m){
		char opt[10];
		int x,y,z;
		scanf("%s",opt);
		if(opt[0]=='C'){
			read(x),read(y),read(z);
			RouteModify(x,y,z);
		}
		else{
			read(x),read(y);
			printf("%d\n",RouteQuery(x,y));	
		}
	}
	return 0;
}
GitHub 国内加速完全指南(最新):镜像、代理与优化技巧 在国内使用 GitHub 时,经常遇到 clone 慢、打开仓库卡、GitHub Actions 不稳定 等问题。下面是整理好的 GitHub 国内镜像和加速方法大全,高效使用 GitHub。 阅读详情

相关推荐

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

【SDOI 2011】染色

算法标签:树链剖分+线段树

forever_dreams的博客 379

霍尔电流传感器在新能源汽车中的应用综述

本文旨在全面剖析霍尔电流传感器在新能源汽车领域的应用现状、技术挑战及发展趋势。通过系统梳理其在电池管理系统、电机控制、车载充电等核心系统的应用场景,深入分析面临的技术瓶颈与创新解决方案,并基于最新技术动向展望未来发展方向,为相关领域的技术创新提供参考依据。

m0_46819860的博客 2259

[SDOI2011]染色(信息学奥赛一本通 1563)(洛谷 2486)

Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。 Input 第一行包含2个整数n和m,分别表示节点数和操作数; 第二行包含n个正整...

anglanjing7414的博客 746

从零开始:在Windows WSL中搭建Openfoam7+blastfoam2.0.0开发环境(避坑大全)

本文详细指导在Windows WSL中搭建OpenFOAM 7与BlastFOAM 2.0.0开发环境,重点解析了安装过程中的常见“坑点”,如编译模式不匹配导致的符号错误,并提供了从系统准备、软件部署到环境验证的完整解决方案,帮助开发者高效构建CFD与爆炸模拟开发平台。

stem5的博客 526

财务惊呼“不可能”!Python 自动识别 PDF 发票,数据秒级录入系统

电子发票(原生 PDF):这种最爽,文字是可以选中的。我们用 PyPDF2 直接提取文本,速度快,准确率 100%。 纸质扫描/拍照发票:这种是图片。必须上 OCR(光学字符识别)。我们要用百度开源的 PaddleOCR,这是目前中文识别效果最好的开源库之一,吊打早已过气的 Tesseract。

BUG猿的博客 1023

【SDOI2011 第1轮 DAY1】染色

题目 问题描述 给定一棵有个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。 输入格式 第一行包含2个整数n和m,分别表示节点数和操作数; 第二行包含n个正整数表示n个节点的初始颜色 下面n-1行每行包含两个整数x和y,表示x和y之间有一条无向边。 下面m行每行描述一个操作: “C a b c”表

weixin_43823476的博客 354

CTK Plugin Framework插件框架学习1--Qt编译CTK

【代码】Qt编译CTK。

贝勒里恩的博客 7430

洛谷P2486 [SDOI2011]染色

思路很简单,实现细节有点多,做了两个半小时。 学过树链剖分一眼就能看出来。 先树链剖分把图建好,线段树维护链,lg,rs表示每个区间的左右端点颜色,seg表示区间颜色段数,tag是染色标记。id是树链上点的编号,W(大写)是树链上点的编号对应的颜色,w(小写)是树链的线段树上叶子的颜色。 #include <bits/stdc++.h> #define mid (l+r)/2 #define ls (k<<1) #define rs (k<<1|1) using

m0_51506155的博客 226

基于STM32+ESP8266+手机APP的心率血氧温湿度监测报警系统设计(项目资料ID:18)

基于 STM32 微控制器、ESP8266 无线模块和 QT 手机 APP 的多参数监测报警系统。该系统可实时采集心率、血氧饱和度、环境温湿度等参数,通过 OLED 显示屏本地显示,并通过 WiFi 模块上传至手机 APP 实现远程监测与数据可视化。系统具备报警阈值自定义功能,当参数超出设定范围时,通过蜂鸣器和 LED 进行声光报警。系统以 STM32F103 为控制核心,采用 MAX30102 传感器采集心率和血氧,DHT20 采集温湿度,通过 ESP8266 实现无线通信,配合 QT 开发的手机 APP

以培养嵌入式工程师为己任 1万+

【深度学习驱动流体力学】OpenFOAM目录流体力学求解器汇总介绍

下面这些目录结构和其中的求解器和工具展示了OpenFOAM作为一个功能强大且广泛应用的开源CFD软件框架的多样性和灵活性。每个求解器都专门用于解决不同类型的流体动力学问题,从基础的流动模拟到复杂的多相流动和燃烧模拟等各种应用场景。

源代码杀手的博客 1184

【算法竞赛学习笔记】[SDOI2011]染色(路径染色+色段查询)

title : [SDOI2011]染色(路径染色+色段查询) tags : ACM,数据结构 date : 2021-11-16 author : Linno P2486 [SDOI2011]染色 题面 给一棵树,支持两种操作: ①给定u,v,w,将u到v的路径上所有节点染成颜色w。 ②给定u,v,查询u到v路径上颜色段的数量。 树链剖分+线段树 树链剖分将无根树拍平后,用线段树去做。维护每个区间的左颜色、右颜色、色段和以及tag,如果合并的时候两端颜色一致,那么ans-1。 #include<.

SC_Linno的博客 978

​ISP算法及架构分析介绍

ISP算法及架构分析介绍ISP即Image Signal Processor,是一种图像处理架构,不是我们用的下载器。ISP其实算是图像处理的一个特例,一般应用于前端设备(相对于SENSOR),从结果上看就是将RAW数据转换成压缩后的RGB(一般)数据,供后续CPU使用(识别、压缩等)。市面上很少有直接介绍ISP的书籍或者资料,今天我们主要是聊一聊ISP算法的架构,这样大...

OpenFPGA的博客 5404

【BZOJ 2243】 [SDOI2011]染色

【BZOJ 2243】 [SDOI2011]染色 树链剖分+线段树标记传递~

Regina8023 1569

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[SDOI2011]染色

2243: [SDOI2011]染色 Time Limit: 20 SecMemory Limit: 512 MBSubmit: 11290Solved: 4392 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2243 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节...

weixin_30532369的博客 156

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

染色 SDOI2011

染色 SDOI2011

DREAMING的博客 430

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

bzoj2243: [SDOI2011]染色

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3271  Solved: 1262 [Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点

thy的专栏 1446

[bzoj2243][SDOI2011]染色

感情有着极大的鼓舞力量,因此,它是一切道德行为的重要前提,谁要是没有强烈的志向,也就不能够热烈地把这个志向体现于事业中。

Unlimited Code Works 315

P2486 [SDOI2011]染色

P2486 [SDOI2011]染色 模型总结 树链剖分+线段树 关键点 懒标记不要忘记下传 #include&lt;iostream&gt; #include&lt;cstdio&gt; #define lc (c&lt;&lt;1) #define rc (c&lt;&lt;1|1) using namespace std; const int inf=1e9; int read(){ ...

qq_37973923的博客 258

bzoj 2243 [SDOI2011]染色

2243: [SDOI2011]染色 Time Limit:20 SecMemory Limit:512 MBSubmit:8655Solved:3239[Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径...

aln1541的博客 117

BZOJ 2243 SDOI2011 染色

2243: [SDOI2011]染色 Time Limit:20 SecMemory Limit:512 MBSubmit:10135Solved:3868[Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路...

182

洛谷 P2486 [SDOI2011]染色

P2486 [SDOI2011]染色 题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案。 输入输出样例 输入样例#1:复制 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C 2 1 1 Q 3 5 C 5 1...

HJ921004的博客 212

bzoj2243[SDOI2011]染色

bzoj2243[SDOI2011]染色 题意: n点无根树,2类操作:将节点a到节点b路径上所有点都染成颜色c、询问节点a到节点b路径上的颜色段数量。 题解: 有点恶心的链剖,可以用包含区间颜色段数,左端点颜色,右端点颜色的结构体存储查询的结果。首先是线段树节点除了要保存区间颜色段数还要保存左右端点颜色,再者是查询的时候要注意合并区间:在线段树查询时,如果递归左端点,就左合并递...

anheku1562的博客 188

BZOJ 2243: [SDOI2011]染色 【树链剖分】

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 4577  Solved: 1709 [Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点

世界很大 587

BZOJ - 2243: [SDOI2011]染色 树链剖分

2243: [SDOI2011]染色 Time Limit:20 SecMemory Limit:512 MBSubmit:10456Solved:4013[Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点...

diangan7073的博客 182

BZOJ 2243: [SDOI2011]染色 树链剖分

2243: [SDOI2011]染色 Time Limit: 20 SecMemory Limit: 512 MBSubmit: 1886Solved: 752[Submit][Status] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续...

alex151194310的博客 106
上一篇: 树链剖分
下一篇: [SDOI2014] 旅行
NephrenRuqInsania
博客等级 码龄8年 20粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值