BZOJ3757 苹果树

Fortran基础编程(3)——格式化输出 本篇推文将进一步讲解Fortran基础语法中格式化输出与声明部分,让我们的代码更加美观起来吧~ 阅读详情

原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3757

苹果树

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

题解

树上莫队模板。

算法介绍的话,写在莫队总结里好了,题解就这样吧。。。

代码
#include<bits/stdc++.h>
#define R register int
using namespace std;
const int M=1e5+5;
struct sd{int f,t,a,b,id;};
sd ask[M];
bool vis[M];
int col[M],team[M],n,m,siz[M],dad[M],dep[M],son[M],top[M],sta[M],id[M],tot,zhan,big,num,ans[M],root,cot[M],hh;
bool operator <(sd a,sd b){return team[a.f]==team[b.f]?id[a.t]<id[b.t]:team[a.f]<team[b.f];}
vector<int>mmp[M];
void in()
{
    int a,b;R i;
    scanf("%d%d",&n,&m);big=(int)pow(n,6.0/10.0);
    for(i=1;i<=n;++i)scanf("%d",&col[i]);
    for(i=1;i<=n;++i){scanf("%d%d",&a,&b),mmp[a].push_back(b),mmp[b].push_back(a);if(!a||!b)root=a?a:b;}
}
int dfs1(int v,int f,int d)
{
    id[v]=++tot;dad[v]=f;siz[v]=1;dep[v]=d;
    int bs=0,to,tmp,now=zhan;
    for(int i=mmp[v].size()-1;i>=0;--i)
    {
        to=mmp[v][i];if(to==f)continue;tmp=dfs1(to,v,d+1);
        if(tmp>bs)son[v]=to,bs=tmp;
        siz[v]+=tmp;
        if(zhan-now>=big){++num;while(zhan!=now)team[sta[zhan--]]=num;}
    }
    sta[++zhan]=v;
    return siz[v];
}
void dfs2(int v,int t)
{
    top[v]=t;int to;
    if(son[v])dfs2(son[v],t);
    for(int i=mmp[v].size()-1;i>=0;--i){to=mmp[v][i];if(to==dad[v]||to==son[v])continue;dfs2(to,to);}
}
int lca(int x,int y)
{
    while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);x=dad[top[x]];}
    return dep[x]<dep[y]?x:y;
}
void rev(int x){if(vis[x]&&--cot[col[x]]==0)hh--;if(!vis[x]&&++cot[col[x]]==1)hh++;vis[x]^=1;}
void walk(int x,int y){while(x!=y){if(dep[x]<dep[y])swap(x,y);rev(x);x=dad[x];}}
void ac()
{
    R i;dfs1(root,0,1);dfs2(root,root);
    if(zhan){num++;while(zhan){team[sta[zhan--]]=num;}}
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d%d",&ask[i].f,&ask[i].t,&ask[i].a,&ask[i].b),ask[i].id=i;
        if(id[ask[i].f]>id[ask[i].t])swap(ask[i].f,ask[i].t);
    }
    sort(ask+1,ask+1+m);
    int F=1,T=1,lc,p;
    for(i=1;i<=m;++i)
    {
        walk(F,ask[i].f);walk(T,ask[i].t);F=ask[i].f,T=ask[i].t;lc=lca(F,T);rev(lc);p=0;
        if(ask[i].a!=ask[i].b&&cot[ask[i].a]&&cot[ask[i].b])p=1;
        ans[ask[i].id]=hh-p;rev(lc);
    }
    for(i=1;i<=m;++i)
    printf("%d\n",ans[i]);
}
int main()
{
    in();ac();
    return 0;
}
VS中的C#项目怎样引入另一个项目 场景 在C#项目A中需要引用项目B。 实现 将项目B手动复制到A所在的项目目录下的同一个解决方案中,即与项目A同级的目录下。 在VS中打开项目B,打开解决方案资源管理器--右击解决方案--添加--现有项目 然后找到项目B的.csproj文件打开。 然后看到资源管理器中已经将B添加进来了 点击项目A的引用-右键-添加 将项目下的解决方... 阅读详情

相关推荐

LED背光驱动电路解析:从MP3394芯片到液晶屏灯管控制

本文深入解析了以MP3394芯片为核心的LED背光驱动电路工作原理。从升压电路的能量转换到多路LED的均流控制,详细阐述了其作为液晶屏背光“大脑”的关键作用,并提供了黑屏、闪屏、亮度不均等常见故障的实战检修思路与排查方法。

agile9scrum的博客 818

BZOJ3757【树上莫队算法】

/* I will wait for you*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define make make_pair #define fi

Lethelody的专栏 695

VMFS数据存储(datastore)丢失后恢复步骤

vmfs datastore恢复步骤

jetliu05的博客 3267

bzoj 3757: 苹果树

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

lqybzx的专栏 991

突破III-V/硅混合集成的挑战:UTC光电探测器能带工程仿真实践

本文探讨了UTC光电探测器在III-V/硅混合集成中的能带工程仿真实践,通过Ansys Lumerical平台实现多物理场仿真,解决晶格失配和能带不连续性等关键挑战。文章详细介绍了FDTD光学仿真和CHARGE电学仿真方法,优化器件性能,提升响应度和带宽,为高速光通信和量子计算提供技术支持。

weixin_29219539的博客 295

Gartner DSG数据安全治理 架构及解读

目录背景:架构图: 解释:英文解释:(自上而下)平衡业务与风险、威胁、合规之间的关系(5个维度之间的平衡)优先处理数据集制定安全策略实施安全工具策略配置同步从上到下,从需求调研开始实施数据安全治理。千万不要跨过数据摸底、治理优先级分析、制定治理整体策略,而直接从技术工具开始对数据安全进行治理。 先明确选择需要治理的对象,优先选择重要数据进行数据安全治理工作。可以通过数据梳理、分类分级等手段,完成数据资产盘点和筛选,在纷杂的数据中理清头绪。

锦慈的技术博客 7216

树上莫队算法

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

RBS的专栏 5875

how2heap 深入学习(1)

how2heap glibc 2.23学习

CoLin的pwn小屋 3179

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

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

zixiangzhan的博客 2022

YOLOv11 改进 - 特征融合 | 小目标检测救星:DySample动态上采样减少特征丢失

本文介绍了超轻量且高效的动态上采样器DySample与YOLOv11的结合,以解决传统上采样器工作负载大、应用场景受限的问题。DySample从点采样角度构建上采样,绕过动态卷积,使用PyTorch标准内置函数实现,无需定制CUDA包,能大幅减少参数、FLOPs等资源消耗。我们将DySample代码集成进YOLOv11。实验脚本显示,结合DySample的YOLOv11在多个密集预测任务中或表现出色。

魔改工程师的博客 1415

06 - 深度学习处理器原理

深度学习处理器的重要性在于它们可以加速深度学习任务的执行,从而推动了人工智能的发展。传统的通用处理器虽然可以执行深度学习任务,但它们不够高效,需要消耗大量的能量和时间。深度学习处理器通过硬件加速和特定设计来优化深度学习任务的执行,从而可以提高执行效率、降低能耗和加速训练和推断过程。 深度学习处理器的发展也推动了深度学习算法的创新,因为算法的发展需要硬件的支持和驱动。同时,深度学习处理器的出现也促进了更广泛的应用场景,包括自动驾驶、人脸识别、语音识别、图像识别等领域。因此,深度学习处理器的重要性不仅在于加速

m0_51339444的博客 752

【数据结构】树上莫队

树上莫队

conti123的博客 1097

LangGraph实战训练营-从零构建AI驱动的wiki知识库

本文深入解析 LangChain 团队开源的 Deep Agents 框架核心示例——LLM Wiki,一个基于大语言模型自动构建和维护持久化知识库的生产级 AI Agent 系统。文章从项目架构、环境搭建、核心原理到实战操作全面展开:详解 CompositeBackend 组合后端与细粒度权限控制的安全设计、四种工作模式(初始化/摄取/查询/质量检查)的完整流程、LangSmith 远程沙箱的隔离执行机制,以及人机协同审核(HITL)的实践应用。

program哲学 198

【BZOJ 3757】 苹果树

树上莫队算法模板题~ 详细题解~

Regina8023 1479

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

weixin_30924239的博客 206

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[BZOJ 3757] 苹果树

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

LPA的博客 480

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

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

BZOJ3757: 苹果树

树上分块 无修改的分块分块方法用王室联邦的方法 至于复杂度分析我不会….. 毕竟SB选手#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; char c; inline void read(i

Don't fake it till you made it 655

BZOJ3757 苹果树——树上莫队

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

DancingZ的博客 434

[bzoj3757]苹果树

题目大意有一颗N个节点的树和M个询问,每个点有一种颜色。每次询问u到v路径上把颜色s和颜色t当作同一种颜色后路径上不同颜色的数目。 n<=5*10^4,m<=10^5树上莫队注意到这题符合莫队算法特征。 于是直接树上莫队即可,用num[x]表示颜色x出现的次数,那么对于把颜色s和t当作同一种颜色只需要看num[s]和num[t]是否都大于0,注意考虑s=t的情况。#include<cstdio>

不来也不去的一只失忆蝴蝶 1203

【bzoj3757】 苹果树

http://www.lydsy.com/JudgeOnline/problem.php?id=3757 (题目链接)MD调了好久,最后蒯了几个标程交上去,没想到都RE了。。。最后才看到: = =题意:求树上两点间路径上有多少个不同的点权。Solution   像这种树链剖分解决不了的问题,大概就是树上莫队。   我们dfs一遍对树分块,这个很简单,不会的见bzoj1086。之后对询问(u

MashiroSky的博客 568

BZOJ 3757 苹果树

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

ba1_1ad的博客 565

bzoj3757 苹果树

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3757 【RE提示】本题不支持提交了,具体可以见discuss,可以通过discuss的方法来做。 【题解】 树上莫队,就是把in/out的DFS序记录下来,每次查找要么查in[a]...in[b],要么查out[a]...in[b],加上LCA. 然后就正常莫队啦! ...

aklm45097的博客 98

【BZOJ】3757: 苹果树

http://www.lydsy.com/JudgeOnline/problem.php?id=3757 题意:n个节点的树,每个点有一种颜色。现有m种询问,每次询问x y a b表示x到y的路径上颜色的种数且a颜色看成b颜色。(n<=50000, m<=100000) dfs序序列分块战术核导弹= =: #include <bits/stdc++.h>...

162

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

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

clover_hxy的博客 1048

[BZOJ 3757]苹果树

树上莫队

_Horizon 729

bzoj3757: 苹果树

传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3757 思路:像这种链剖 or lct没法做的就是树上莫队了... 不是树上的莫队就是按询问的左端点所在的块为第一关键字,右端点为第二关键字。 但是树上的就不同了,树上不是区间。 于是我们就进行树分块——见bzoj1086 注意这个分块是不需要保证每块的点都联通的,这个分块只

thy的专栏 1316
上一篇: 1000入门测试题目
下一篇: Luogu4074[WC2013] 糖果公园
ShadyPi
博客等级 码龄9年 1万+粉丝 637原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值