BZOJ3757 苹果树——树上莫队

输入有两行。第1行先是一个整数n表示苹果的个数,接着是n个整数,分别表示n个苹果的高度。第2行是两个整数,分别表示小明的身高和凳子的高度。输出仅一行。一个整数m,表示小明最多能摘到m个苹果。 小明家的院子里种了很多蔬菜和果树,平日里他最喜欢帮家里采摘蔬菜和水果了。这不眼看着那棵高大的苹果树上结的苹果到了采摘的时候,他高兴得站在树下跃跃欲试。这可难不倒聪明的小明,他马上借来了一个凳子,踩在上面就可以摘到更多的苹果啦。第1行先是一个整数n(1≤n≤1000),表示苹果的个数,接着是n个整数,分别表示n个苹果的高度(不超过1000的正整数)。第2行是两个整数,分别表示小明的身高和凳子的高度。[提交] [状态] [讨论版] [命题人:admin]1091: 采摘的快乐(1级)C语言程序设计练习题。 阅读详情

Description

  神犇家门口种了一棵苹果树。苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条。由于这棵苹果树是神犇种的,所以苹果都发生了变异,变成了各种各样的颜色。我们用一个到n之间的正整数来表示一种颜色。树上一共有n个苹果。每个苹果都被编了号码,号码为一个1到n之间的正整数。我们用0代表树根。只会有一个苹果直接根。
  有许许多多的人来神犇家里膜拜神犇。可神犇可不是随便就能膜拜的。前来膜拜神犇的人需要正确回答一个问题,才能进屋膜拜神犇。这个问题就是,从树上编号为u的苹果出发,由树枝走到编号为v的苹果,路径上经过的苹果一共有多少种不同的颜色(包括苹果u和苹果v的颜色)?不过神犇注意到,有些来膜拜的人患有色盲症。具体地说,一个人可能会认为颜色a就是颜色b,那么他们在数苹果的颜色时,如果既出现了颜色a的苹果,又出现了颜色b的苹果,这个人只会算入颜色b,而不会把颜色a算进来。
  神犇是一个好人,他不会强人所难,也就会接受由于色盲症导致的答案错误(当然答案在色盲环境下也必须是正确的)。不过这样神犇也就要更改他原先数颜色的程序了。虽然这对于神犇来说是小菜一碟,但是他想考验一下你。你能替神犇完成这项任务吗?

Input

  输入第一行为两个整数n和m,分别代表树上苹果的个数和前来膜拜的人数。
  接下来的一行包含n个数,第i个数代表编号为i的苹果的颜色Coli。
  接下来有n行,每行包含两个数x和y,代表有一根树枝连接了苹果x和y(或者根和一个苹果)。
  接下来有m行,每行包含四个整数u、v、a和b,代表这个人要数苹果u到苹果v的颜色种数,同时这个人认为颜色a就是颜色b。如果a=b=0,则代表这个人没有患色盲症。

Output

  输出一共m行,每行仅包含一个整数,代表这个人应该数出的颜色种数。

Sample Input

5 3

1 1 3 3 2

0 1

1 2

1 3

2 4

3 5

1 4 0 0

1 4 1 3

1 4 1 2

Sample Output

2

1

2

Hint

0<=x,y,a,b<=N
N<=50000
1<=U,V,Coli<=N
M<=100000

拉成dfs序。观察dfs序发现,u->v(u比v先访问)路径上的点在dfs序的sec[u]~fir[v]中只出现一次。。。然后就又乱搞。

 

第二次更新:说的好像很不清楚呀!dfs序之后fir[x]->fir[y]包含了整棵x的子树,而我们想要查询的是路径问题,然而我们又发现,我们想要的x->y路径上的点都只会在dfs序中出现一次(我们把dfs拉成2*n),而无关点包括进出共两次,所以满足异或的性质,在序列中移指针的时候维护一个vis[x]数组就可以了,详见代码

#include<bits/stdc++.h>
using namespace std;
#define Inc(i,L,r) for(register int i=(L);i<=(r);++i)
#define Red(i,r,L) for(register int i=(r);i>=(L);--i)
const int N = 5e4+10,Maxc = 1e6+10;
int n,m,c[N];
int cnt,dep[N],fir[N],sec[N],rp[N<<1];
int bl[N<<1];
struct Query{
	int L,r,p,A,b,idx;
}q[N<<1];
bool cmp(const Query&A,const Query&b){
	if(bl[A.L]^bl[b.L])return A.L<b.L;
	return bl[A.L]&1?A.r<b.r:A.r>b.r;
}
struct LCA{
	vector<int>G[N];
	int p[N][17];
	inline void init(){
		scanf("%d%d",&n,&m);
		Inc(i,1,n)scanf("%d",&c[i]);
		Inc(i,1,n){
			int x,y;scanf("%d%d",&x,&y);
			G[x].push_back(y);
			G[y].push_back(x);
		}
	}
	inline void dfs(int x,int fa,int depth){
		rp[fir[x]=++cnt]=x;
		Inc(i,0,G[x].size()-1)if(G[x][i]^fa){
			dfs(G[x][i],p[G[x][i]][0]=x,dep[G[x][i]]=depth+1);
		}
		rp[sec[x]=++cnt]=x;
	}
	inline void ST(){
		memset(p,-1,sizeof(p));
		dfs(0,0,0);
		int maxdep=log2(n);
		Inc(j,1,maxdep)
			Inc(i,1,n)if(~p[i][j-1])p[i][j]=p[p[i][j-1]][j-1];
	}
	inline int lca(int x,int y){
		if(dep[x]<dep[y])swap(x,y);
		Red(i,log2(dep[x]),0)if((dep[x]-(1<<i))>=dep[y])x=p[x][i];
		if(x==y)return y;
		Red(i,log2(dep[x]),0)
			if(p[x][i]^p[y][i])x=p[x][i],y=p[y][i];
		return p[x][0];
	}
}g;
struct MOTO{
	inline void init(){
		Inc(i,1,m){
			int x,y,A,b;scanf("%d%d%d%d",&x,&y,&A,&b);
			if(fir[x]>fir[y])swap(x,y);
			int p=g.lca(x,y);
			if(x==p)q[i]=(Query){fir[x],fir[y],0,A,b,i};
			else q[i]=(Query){sec[x],fir[y],p,A,b,i};
		}
	}
	int tmp,ans[N<<1],doc[Maxc];
	bool vst[N];
	inline void addr(int x){
		if(vst[x]){
			if(--doc[c[x]]==0)--tmp;
		}else {
			if(++doc[c[x]]==1)++tmp;
		}
		vst[x]^=1;
	}
	inline void solv(){
		int siz=sqrt(n<<1);
		Inc(i,1,n<<1)bl[i]=(i-1)/siz+1;
		sort(q+1,q+m+1,cmp);
		int L=1,r=0;
		Inc(i,1,m){
			while(L>q[i].L)addr(rp[--L]);
			while(L<q[i].L)addr(rp[L++]);
			while(r<q[i].r)addr(rp[++r]);
			while(r>q[i].r)addr(rp[r--]);
			if(q[i].p)addr(q[i].p);
			ans[q[i].idx]=tmp;
			if(doc[q[i].A]&&doc[q[i].b]&&(q[i].A^q[i].b))--ans[q[i].idx];
			if(q[i].p)addr(q[i].p);
		}
		Inc(i,1,m)cout<<ans[i]<<"\n";
	}
}mq;
int main(){
	g.init();
	g.ST();
	mq.init();
	mq.solv();
	return 0;
}

 

陶陶摘苹果2 1 第一行只包括两个正整数n(5<=n<=200)和m(60<=m<=200),表示苹果数目和桃桃伸手可 达到的高度(以厘米为单位)。第二行包含n个100到200之 立即下载

相关推荐

算法面试八股文『 基础知识篇 』

个人整理的算法面试基础知识八股文,内容较详细。

SG_teresa's blog 4337

输入为两行,第一行为一个正整数 n,表示进行了 n 轮疏果操作,1<=n<20; 第二行为 n+1 个整数,第一个整数 t 表示初始苹果数(0<t<1000),其后 n 个整数为 0 或负 整数(每个...

输入: 3 10 -5 0 -10 输出: 5 3 算法思路: 首先读入 n 和 t。 循环 n 次,每次读入一个数,如果这个数是 0,则不对苹果数量进行改变;如果这个数是负数,则减去这个数的绝对值。 在每一轮操作后,判断是否是疏果最多的轮次,如果是,则更新疏果最多的轮次。 输出最后剩余的苹果数量和疏果最多的轮次。 代码实现: ...

weixin_42594419的博客 379

Vector CANape的使用记录

开门见山,今天想和大家分享下CANape使用记录,分享原因是近日在分析一个客户现场软件问题时,需要用到CANape来实时的监测ECU中的变量,因为之前对CANape的认知比较浅薄,觉得标定工程师使用他就足够了,但是这次的经历让我觉得需要写点东西来记录自己学习并使用他的过程。 相信大家能够在网上找到很多关于如何使用CANape的文章,从新建Project到后面的数据的观测、保存以及回放等等。我个人也是这么学过来的,所以我不打算从那些方面着手去描述如何使用她,而是根据我的真实使用过程以及问题的抛出到如何解决来

2万+

NYOJ 苹果

苹果 时间限制:3000ms | 内存限制:65535KB 难度:2 描述 ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。 输入有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n、v同时为0时结束测试,此时不输出。接下来的n行,每行2个正整数,用空格...

weixin_30828379的博客 300

NLP DAY1: 文本数据读取

txt 文本数据的读写CSV 及 Excel 文本数据的读写更多的 DataFrame 操作数据规模太大怎么办相信通过本次实验的学习,同学们可以游刃有余地面对各种数据文件了。在接下来的实验中,我们将开始真正地开启自然语言处理之旅,开始认识并熟悉一些常见的针对文本本身的预处理操作。

feifeikon的博客 1058

PLL锁相环基础知识(一)

本文介绍了锁相环(PLL)的核心组件及其工作原理,重点阐述了压控振荡器(VCO)的结构与调谐机制。VCO作为PLL的关键部分,通过变容二极管实现频率调谐,但易受温度、电压等因素影响稳定性。文章详细讲解了VCO的谐振电路原理、硅基集成方案,以及通过分频器和调制器实现的频率控制技术。特别分析了整数型和分数型N分频器的差异,指出高阶德尔塔-西格玛调制器可有效降低分数杂散。文章还探讨了预分频器的应用及其对频率分辨率的影响,揭示了PLL通过反馈环路实现频率锁定的基本原理。

weixin_49761275的博客 3029

c++距离1

c++

weixin_70441119的博客 526

Cesium实战:从DEM数据到3D地形可视化的全流程解析

本文详细解析了从DEM数据到3D地形可视化的全流程,重点介绍了Cesium和Cesiumlab在数字高程模型(DEM)处理与地形数据转换中的应用。通过实战案例和工具对比,帮助开发者高效实现地形可视化,并分享性能优化与高级功能开发经验。

weixin_29079743的博客 336

【树上莫队算法】苹果树

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

weixin_44111457的博客 782

华为昇腾 Atlas 200I DK A2 开发板编程接口学习入门:系统安装和开发步骤、注意事项与典型案例实战

华为昇腾开发板编程接口指南:从入门到进阶 本文系统介绍了华为昇腾开发板的编程接口体系,涵盖MindXSDK和AscendCL两大核心框架。MindXSDK提供高层封装接口,适合快速搭建视觉应用;AscendCL则是底层接口,需手动管理设备内存。文章详细讲解了: 开发环境搭建步骤,包括系统配置、依赖安装 MindXSDK组件化编程流程(图像分类实例) AscendCL底层开发方法(内存管理、模型推理) 常见问题解决方案和调试技巧 两个典型应用实例(摄像头目标检测和图像分类) 针对小白开发者,推荐从MindXS

bother3000的博客 2424

K8S搭建(centos)四、安装K8S

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 2646

BZOJ 3757 苹果树 树上莫队

题目大意:给出一棵树,问任意两点之间有多少种不同的颜色,一个人可能会有色盲,会将A和B当成一种颜色。 思路:比较裸的树上莫队,写出来之后,很慢,怀疑是分块的缘故,然后果断找了当年比赛的标称交上去,瞬间rk1,大概看了一眼,他好像是直接用DFS序+曼哈顿距离最小生成树搞的,为什么会比分块快? 昨天下午看到这个题之后就一直在研究树上莫队的正确姿势,然后先写了树分块,后来看了很多牛人的SPO

(╯°口°)╯(┴—┴ 3665

低光照图像增强:从传统方法到深度学习

低光照图像增强:从传统方法到深度学习​ 人工智能,计算机视觉,大模型,AI,本文聚焦视觉模型的偏差与公平性问题,阐述了偏差在性别、种族、年龄等方面的表现及对医疗、司法、安防等领域的影响。分析了偏差源于数据采集与标注问题及算法局限。介绍了准确率差异等公平性评估指标、相关数据集和工具,还给出数据处理、算法改进、模型训练等避免歧视的策略,并附代码示例与实际案例,为提升视觉模型公平性提供多方面参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 2万+

[BZOJ3757]苹果树(树上莫队)

树上莫队共有三种写法:   1.按DFS序列分块,和普通莫队类似。常数大,不会被卡。   2.按块状树的方式分块。常数小,会被菊花图卡到O(n)。   3.按[BZOJ1086]王室联邦的方式分块。常数小,不会被卡。唯一的缺点是较抽象,一个块可能是不连通的。 权衡一下当然还是写第三种做法,具体看代码。 然后还有一个问题,手动模拟莫队移动左右端点指针的过程,会发现LCA处较难处理,它常常是...

weixin_30924239的博客 206

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

bzoj 3757 苹果树(树上莫队)

题目链接 3757: 苹果树 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 1674  Solved: 550 [Submit][Status][Discuss] Description     神犇家门口种了一棵苹果树。苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,

fouzhe的博客 983

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[BZOJ 3757]苹果树:树上莫队

点击这里查看原题建议先看这里的讲解 树上莫队大体思路就是把树分成块,区间与区间之间实现O(sqrt(n))的转换,然后当成莫队去做。/* User:Small Language:C++ Problem No.:BZOJ 3757 */ #include<bits/stdc++.h> #define ll long long #define inf 999999999 using namespace

SmallSXJ的博客 442

bzoj 3757: 苹果树(树上莫队)

3757: 苹果树 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 1327  Solved: 510 [Submit][Status][Discuss] Description     神犇家门口种了一棵苹果树。苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只

clover_hxy的博客 1048

BZOJ3757: 苹果树【树上莫队】

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

weixin_30412577的博客 112

【BZOJ3757】苹果树(树上莫队)

点此看题面 大致题意: 每次问你树上两点之间路径中有多少种颜色,每次询问可能会将一种颜色\(a\)看成\(b\)。 树上莫队 这题是一道树上莫队板子题。 毕竟求区间中有多少种不同的数是莫队算法的经典应用啊。 关于将颜色\(a\)看成\(b\) 这操作其实很好处理。 只要判断\(cnt_a\)和\(cnt_b\)是否同时\(>0\)即可。 但要注意特判\(a==b\)的情况。 代码 #incl...

weixin_30785593的博客 119

BZOJ_P3757 苹果树(树上莫队+LCA)

BZOJ传送门Time Limit: 20 Sec Memory Limit: 256 MB Submit: 1221 Solved: 476 [Submit][Status][Discuss] Description 神犇家门口种了一棵苹果树。苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条。由于

BeiYu 929

Web自动化测试选型决策地图:Playwright与Selenium实战对比

Web自动化测试本质是平衡稳定性、可维护性与团队能力的工程实践。其核心原理在于通过精准元素定位与智能等待机制保障脚本鲁棒性,技术价值体现在降低回归成本、加速CI/CD反馈、提升质量左移效率。典型应用场景涵盖电商大促回归、微前端兼容测试、低代码业务监控及AI增强探索等。在真实项目中,Playwright凭借原生多浏览器支持、TypeScript深度集成与frame_locator链式语法,在高动态页面中显著优于传统Selenium;而WebDriverIO则以Java/Python友好语法成为存量系统升级的高

weixin_34210740的博客 104

[BZOJ3757]苹果树(树上莫队+分块)

题目: 我是超链接 题解: 我们刚刚学习了一种树上分块的方法,然后对于每个询问以左端点所在的块为第一关键字,右端点的dfs序为第二关键字排序。 那么如何进行区间的转移呢?我们来证明一下!【诶等等公式恐惧的朋友们不要走】 定义S(u,v)" role="presentation" style="position: relative;">S(u,v)S(u,v)S(u,v)表示u到v路径

薇小薇 530

【BZOJ-3757】苹果树 块状树 + 树上莫队

3757: 苹果树 Time Limit:20 SecMemory Limit:256 MBSubmit:1305Solved:503[Submit][Status][Discuss] Description 神犇家门口种了一棵苹果树。苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在...

weixin_30883271的博客 89
上一篇: USACO 2002 February Green 重建道路
下一篇: BZOJ3723 Network——Kruskal重构树
DancingZ
博客等级 码龄9年 10粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值