【JZOJ3360】苹果树【树上莫队】【LCA】

【WRF-Chem教程第四期上】运行 WRF-Chem 模型 完整介绍运行 WRF-Chem 模型的详细步骤 阅读详情

题目大意:

题目链接:https://jzoj.net/senior/#main/show/3360
给定一棵 n n n个节点的树,每个节点有一个颜色。查询两个节点之间路径上有多少种不同
的颜色,一次查询可以将一种颜色视为另一种。


思路:

考试时就写了一条链的莫队部分分+暴力的 20 p t s 20pts 20pts。然后写炸了。暴力和莫队各有一个点没拿到 q w q qwq qwq。
正解是树上莫队。就是莫队的一个升级版本。
先求出这棵树的欧拉序,在欧拉序上跑莫队,注意如果这个区间涵盖了一个点偶数次,那么这个点就是不在树上这两个点的路径之间的。因为这个点肯定在这个区间内进入了一次并且出去了一次。
所以我们的莫队不能像普通的莫队一样直接写 a d d , d e l add,del add,del,要先判断这个点的出现次数的奇偶,然后再选择 a d d , d e l add,del add,del来修改。虽然好像没有什么区别
细节比较多,调了好久,注意细节即可。


代码:

#include <map>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=200010,LG=18;
int a[N],head[N],cnt[N],ans[N],f[N][LG+1],dep[N],dfn[N],s[N],t[N],pos[N],p[N];
int n,m,tot,T,sum,num;
bool find[N];

struct Ask
{
	int l,r,a,b,id;
}ask[N];

struct edge
{
	int to,next;
}e[N];

int read()
{
	int d=0;
	char ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch))
		d=(d<<3)+(d<<1)+ch-48,ch=getchar();
	return d;
}

bool cmp(Ask x,Ask y)
{
	if (pos[x.l]<pos[y.l]) return 1;
	if (pos[x.l]>pos[y.l]) return 0;
	return x.r<y.r;
}

void add(int from,int to)
{
	e[++tot].to=to;
	e[tot].next=head[from];
	head[from]=tot;
}

void dfs1(int x,int fa)
{
	dfn[++num]=x;
	s[x]=num;
	for (int i=head[x];~i;i=e[i].next)
		if (e[i].to!=fa) dfs1(e[i].to,x);
	dfn[++num]=x;
	t[x]=num;
}

void del(int x)
{
	cnt[a[x]]--;
	if (!cnt[a[x]]) sum--;
}

void add(int x)
{
	if (!cnt[a[x]]) sum++;
	cnt[a[x]]++;
}

void maintain(int x)
{
	p[x]^=1;
	if (!p[x]) del(x);
		else add(x);
}

void dfs2(int x,int fa)
{
	dep[x]=dep[fa]+1;
	f[x][0]=fa;
	for (int i=1;i<=LG;i++)
		f[x][i]=f[f[x][i-1]][i-1];
	for (int i=head[x];~i;i=e[i].next)
	{
		int v=e[i].to;
		if (v!=fa) dfs2(v,x);
	}
}

int lca(int x,int y)
{
	if (dep[x]<dep[y]) swap(x,y);
	for (int i=LG;i>=0;i--)
		if (dep[f[x][i]]>=dep[y]) x=f[x][i];
	if (x==y) return x;
	for (int i=LG;i>=0;i--)
		if (f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	return f[x][0];
}

int main()
{
	freopen("data.txt","r",stdin);
	freopen("ans.out","w",stdout);
	memset(head,-1,sizeof(head));
	n=read(); m=read();
	T=sqrt(n*2);
	for (int i=1;i<=n*2;i++)
		pos[i]=(i-1)/T+1;
	for (int i=1;i<=n;i++)
		a[i]=read();
	for (int i=1,x,y;i<=n;i++)
	{
		x=read(); y=read();
		add(x,y); add(y,x);
	}
	dfs1(0,0);
	dfs2(0,0);
	for (int i=1;i<=m;i++)
	{
		ask[i].l=read(); ask[i].r=read(); 
		ask[i].a=read(); ask[i].b=read();
		ask[i].id=i;
		int LCA=lca(ask[i].l,ask[i].r);
		if (ask[i].l==LCA)
		{
			swap(ask[i].l,ask[i].r);
			ask[i].l=t[ask[i].l];
			ask[i].r=t[ask[i].r];
		}
		else if (ask[i].r==LCA)
		{
			ask[i].l=t[ask[i].l];
			ask[i].r=t[ask[i].r];
		}
		else
		{
			if (t[ask[i].l]>t[ask[i].r]) swap(ask[i].l,ask[i].r);
			ask[i].l=t[ask[i].l];
			ask[i].r=s[ask[i].r];
		}	
	}
	sort(ask+1,ask+1+m,cmp);
	int l=1,r=0;
	for (int i=1;i<=m;i++)
	{
		for (;l<ask[i].l;l++) maintain(dfn[l]);
		for (;l>ask[i].l;l--) maintain(dfn[l-1]);
		for (;r<ask[i].r;r++) maintain(dfn[r+1]);
		for (;r>ask[i].r;r--) maintain(dfn[r]);
		int x=dfn[l],y=dfn[r];
		int LCA=lca(x,y);
		if (LCA!=x && LCA!=y) add(LCA);
		if (cnt[ask[i].b] && cnt[ask[i].a] && ask[i].a!=ask[i].b) ans[ask[i].id]=sum-1;
			else ans[ask[i].id]=sum;
		if (LCA!=x && LCA!=y) del(LCA);
	}
	for (int i=1;i<=m;i++)
		printf("%d\n",ans[i]);
	return 0;
}
基于FPGA的最大功率点跟踪(MPPT)系统开发 - MATLAB实现 最大功率点跟踪(Maximum Power Point Tracking,MPPT)是太阳能光伏系统中的重要技术,它通过调整太阳能电池板的工作点,以最大化输出功率。通过FPGA系统设计和硬件验证,我们可以实现太阳能光伏系统中的最大功率点跟踪。这种基于FPGA的MPPT系统具有高性能和灵活性,适用于太阳能光伏系统中的实时最大功率点跟踪。MPPT算法的选择对于系统的性能至关重要。在本文中,我们选择使用Perturb and Observe(P&O)算法,它是一种常用的基于光伏阵列电压和电流测量的迭代算法。 阅读详情

相关推荐

Shopee 虾皮API接口:商品详情采集的实践

随着电商行业的蓬勃发展,数据采集和分析在商业决策中扮演着越来越重要的角色。Shopee作为东南亚领先的电商平台,拥有大量的商品数据。通过Shopee的API接口,我们可以方便地获取商品详情,为数据分析和市场研究提供有力支持。本文将介绍如何使用Shopee API接口采集商品详情,并分享一些实践技巧。提供了丰富的数据接口,包括商品详情、店铺信息、订单数据等。通过API接口,开发者可以轻松地获取Shopee平台上的数据,进行进一步的处理和分析。Shopee API接口:商品详情采集的实践与技巧。

An4480的博客 1886

bzoj3757 苹果树 树上莫队

题目链接:传送门 题目大意: 给定一棵nnn个节点的树,每个节点有一个颜色aia_iai​。 有mmm个询问,每次给出u,v,a,bu,v,a,bu,v,a,b,表示uuu到vvv的路径上,把所有颜色aaa看成颜色bbb,求出有多少种颜色。 询问不会修改节点真实的颜色。 n&lt;=50000.n&lt;=50000.n<=50000. 如果这是一个序列,那么显然是一个无修改...

The_OIer的博客 328

KEIL-MDK代码美化神器:AStyle配置全攻略(附常用参数详解)

本文详细介绍了如何在KEIL-MDK中配置和使用AStyle代码格式化工具,包括基础参数设置、高级格式控制、团队协作方案以及KEIL深度集成技巧。通过合理的AStyle配置,开发者可以显著提升代码风格一致性,优化团队协作效率,特别适合嵌入式开发项目。

weixin_30505225的博客 146

树上莫队算法

江湖传闻,莫队算法能够解决一切区间查询问题。这样说来,莫队算法也能够解决一切树上路径查询问题,将树上操作转化为DFS序列上的区间操作即可。当然考虑到,树上路径在DFS序列中的性质,还要会求LCALCA。考虑上图中的树,其DFS序为其任意点对aa、bb之间的路径,具有如下性质,令lcalca为aa、bb的最近公共祖先: 若lcalca是aa、bb之一,则aa、bb之间的InIn时刻的区间或者OutOu

RBS的专栏 5875

告别水印!Vue3项目集成Stimulsoft.Reports.js完整配置与激活指南

本文详细介绍了如何在Vue3项目中集成Stimulsoft.Reports.js,提供从授权策略到性能优化的完整解决方案。通过模块化架构设计和现代化引入方式,帮助开发者高效实现专业级报表功能,同时避免版权风险和水印问题,特别适合中小型项目需求。

weixin_33701294的博客 431

2024年上半年试题二:论性能测试方法及其应用

2025年1月,我以系统分析师的身份参与了公司OA系统的开发与建设。该系统包含的功能有打卡签到、公文流转、工资查询等。我们吸取了之前由于系统使用人数激增暴露出的短时间卡顿等问题,所以在本次开发中,我们非常重视系统的性能测试。通过自动化的测试工具模拟多种正常、峰值及异常负载条件对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样,常见的负载测试和压力测试都属于性能测试。

银帅 548

莫队算法(普通,带修,回滚,树上)

这是用来复习的博客,不太建议想要初学普通莫队的人看这篇博客,不过要是想快速复习一遍,这个博客可能比较适合你。 莫队算法(普通,带修,回滚) 莫队算法是一种通过对询问多关键字排序来降低时间复杂度的算法,当一些可离线题目满足 一个询问[l,r]的答案可以由[l-1,r]/[l+1,r]/[l,r-1]/[l,r+1]更新得到 时,可以考虑莫队算法。普通莫队不支持修改,不过如果是简单的修改可以用带修莫队/回滚莫队解决,至于树上问题则需要引入树上莫队,这里不做介绍(因为我也不会……)。实现简洁,应用面大,非常值得一

zixiangzhan的博客 2022

2024年数字IC秋招-格科微-数字电路设计工程师-笔试题

笔试题型:简答题(9个)笔试平台:牛客(电脑监控)笔试时间:2h。

qq_42135020的博客 1605

【数据结构】树上莫队

树上莫队

conti123的博客 1097

上午题目复习ing

无线局域网,11b是常用的,2.4ghz,后来改进5ghz,有些字段可以工作在5g的字段802.11/11a/1h/11n,,,,,11b和11g还在2.4ghz工作。数据链路层 传输服务,数据链路维护,差错控制,arp ip到mac,rarp反过来,token ring,x.25,atm,ethernet,蓝牙10m,简化因特网,分散式网,快调频,短包,点对点,点多多点,2.4ghz,最高速率1mb/s。gsm:是时分多址,900m-1800m,微蜂窝是市区,微微风是室内,伞是盲点,

weixin_47120900的博客 893

Openclaw接入大模型API,操作本地windows文件

本文介绍了在WSL2环境下配置OpenClaw使用阿里百炼API的方法。主要内容包括:1)确认WSL2安装完成;2)配置阿里百炼API(需注意Qwen3-Max-Thinking为收费模型);3)提供正确的JSON配置格式示例,强调apiKey必须填写真实值;4)说明配置错误需修改Linux配置文件;5)建议通过询问模型信息验证连接成功。后续将介绍如何切换免费API及本地文件访问功能。

qq_27246521的博客 989

树上莫队、带修莫队

树上莫队,美其名曰在树上进行莫队操作,即区间维护、查询但之前的莫队都在线性区间操作,对于树上莫队,考虑转化树形结构为链式结构使用——

m0_71198491的博客 873

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[树上莫队][lca] Jzoj P3360 苹果树

Description 神犇家门口种了一棵苹果树。苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条。由于这棵苹果树是神犇种的,所以苹果都发生了变异,变成了各种各样的颜色。我们用一个1到N之间的正整数来表示一种颜色。树上一共有N个苹果。每个苹果都被编了号码,号码为一个1到N之间的正整数。我们用0代表树根。只会...

weixin_30881367的博客 90

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jzoj3360-[NOI2013模拟]苹果树【树上莫队,LCA】

正题 题目大意 一棵树上每个节点有不同的颜色,然后每次询问(x,y,a,b)(x,y,a,b)(x,y,a,b)表示将颜色aaa看为颜色bbb的情况下询问xxx到yyy有多少不种的颜色。 解题思路 数颜色,显然树上莫队。我们维护一个欧拉序dfndfndfn(进去时记录一次出来时记录一次),然后rfnirfn_irfni​表示点iii进入时在dfndfndfn中的位置,rgnirgn_irgni...

QuantAsk 379

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jzoj3360. 苹果树(树上莫队)

题目描述 Description 神犇家门口种了一棵苹果树。苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条。由于这棵苹果树是神犇种的,所以苹果都发生了变异,变成了各种各样的颜色。我们用一个1到N之间的正整数来表示一种颜色。树上一共有N个苹果。每个苹果都被编了号码,号码为一个1到N之间的正整数。我们用0代表树根。只会...

某司机的黑车 227

欢乐纪中某A组赛【2019.7.12】

暴力写挂!!!

QuantAsk 526

超全的莫队算法一遍过

莫队的基本思想、回滚莫队、树上莫队、二次离线,一文搞定。什么?你还不会莫队?看完这篇文章你就会了

GROZAX的博客 9016

树上莫队(随意看看)

莫队的简单介绍 今天我们简单的来看一下长在树上的莫队 要说莫队是一个很暴力,很高效的算法 考场上的暴力乱搞佳品 网上有国际友人的blog,不过需要一点英语知识(或者是google翻译) 最简单的不修改线性莫队 莫队重点就在于分块(这可是精髓) 一般的,我们就分成sqrt(n)块 struct node{ int x,y,block; }; node Q[N]; in

Coco_T的博客 816

树上莫队

树上莫队 引入 树上莫队看名字就知道,其实是把莫队搬到了树上。一般来说,这种问题有几个特征: 询问可以离线 答案并不好用树形DP或者数据结构维护,往往只能暴力跑到所有的点求。 我们拿一道例题:SP10707 COT2 这样的话,我们很容易就想到需要用莫队。可是莫队算法是基于一个序列的,我们怎么在树上跑莫队呢? 把树整成一个序列不就好了。一般来说,有dfs序和欧拉序两种情况。 什...

Destiny 1148

[学习笔记]树上莫队

远古博客:莫队算法——暴力出奇迹 https://blog.youkuaiyun.com/u012061345/article/details/54093879 树上莫队也就一句话: 把树上路径用欧拉序(入栈出栈序)变成区间,区间莫队即可 思想就是利用遍历构造出路径,入栈出栈相互抵消处理多余的点。 多了细节和讨论: 1.某个点存在一次贡献为1,存在两次贡献为0, 2.莫队的l,r要通过是否...

weixin_34220963的博客 347

莫队、带修莫队、树上莫队详解

这几天学习了莫队算法,试着写一篇比较详细的莫队教程吧... 普通莫队 简介 莫队是一种基于分块思想的离线算法,用于解决区间问题,适用范围如下: 只有询问没有修改。 允许离线。 在已知询问 \([l,r]\) 答案的情况下可以 \(O(1)\) 得到 \([l,r-1],[l,r+1],[l-1,r],[l+1,r]\) 的答案。 满足以上三个条件就可以在 \(O(n\sqrt{m}+mlogm...

weixin_30586257的博客 296

树上莫队(括号序列树上莫队)

学习树上莫队及例题

r11111se的博客 691

莫队算法讲解(含树上莫队)

莫队算法莫队算法是一种离线算法,通常不能有修改 操作。 其通过对询问操作的执行顺序进行更改,然后使用最暴力的方法,可以达到很好的复杂度。首先,如果要用莫队算法,则必须满足已知ans[ll,rr]可以得到ans[ll+1,rr],ans[ll-1,rr],ans[ll,rr+1],ans[ll,rr-1]。莫队算法的实现步骤为: 1、先对原序列进行分块。 2、离线操作,对询问进行排序,以左端点所

XianHaoMing的博客 1万+

神奇的莫队(含树上莫队)

例题基本上是洛谷上的编号,bzoj上的编号请自行寻找….. 有木有和我一样比较稀饭洛谷的……普通莫队莫队是一种很暴力的算法…… 是一种基于分块思想的算法……. 莫队的思路是把询问排序之后处理可以优化时间复杂度降低~~ 大家都知道当前的l−rl-r的这个区间已经处理出来了,之后求l′−r′l'-r'这个区间,就可以用|l′−l|+|r′−r||l'-l|+|r'-r|的复杂度求出来,所以只要排

litble的成(tui)长(fei)史 1621
上一篇: 【JZOJ3237】间谍派遣【最小生成树】
下一篇: 【JZOJ3362】数数【分块打表】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值