题面链接

/*
代码正确性不保证。。(不过交了SPOJ没WA T了最后一个点)
在DFS序做莫队
当一个点不是另一个点的LCA时,需要加上它们LCA的贡献
*/
#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=4e5+5,M=1e5+5; int n,m,size,Enum,H[N],nxt[N<<1],to[N<<1],dep[N],fa[N],top[N],son[N],sz[N];
int Now,Ans[M],seq[N<<1],in[N],out[N],id,A[N],tm[N];
bool vis[N];
struct Ques
{
int l,r,lca,id,x,y;
bool operator <(const Ques &a)const{
return l/size<a.l/size?r<a.r:l/size<a.l/size;
}
}q[M]; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline void AddEdge(int u,int v)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
void Pre_DFS(int x)
{
in[x]=++id, seq[id]=x, sz[x]=1;
int mx=0;
for(int v,i=H[x]; i; i=nxt[i])
if((v=to[i])!=fa[x])
{
fa[v]=x, dep[v]=dep[x]+1, Pre_DFS(v), sz[x]+=sz[v];
if(sz[v]>mx) mx=sz[v],son[x]=v;
}
out[x]=++id, seq[id]=x;
}
void DFS2(int x,int tp)
{
top[x]=tp;
if(son[x])
{
DFS2(son[x],tp);
for(int i=H[x]; i; i=nxt[i])
if(to[i]!=fa[x]&&to[i]!=son[x])
DFS2(to[i],to[i]);
}
}
int Query_LCA(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) std::swap(x,y);
x=fa[top[x]];
}
return dep[x]>dep[y]?y:x;
}
void Calc(int p)
{
if(vis[p])
if(!--tm[A[p]]) --Now;
else ;
else if(++tm[A[p]]==1) ++Now;
vis[p]^=1;
} int main()
{
n=read(),m=read(),size=sqrt(n<<1);
for(int i=1; i<=n; ++i) A[i]=read();
for(int u,v,i=1; i<=n; ++i) u=read(),v=read(),AddEdge(u,v);
Pre_DFS(0), DFS2(0,0);
for(int u,v,w,i=1; i<=m; ++i)
{
u=read(),v=read(),w=Query_LCA(u,v),q[i].x=read(),q[i].y=read();
q[i].id=i;
if(u==v) {Ans[i]=1; continue;}
if(in[u]>in[v]) std::swap(u,v);
if(w==u) q[i].l=in[w],q[i].r=in[v],q[i].lca=0;
// else if(w==v) q[i].r=in[w],q[i].r=in[u],q[i].lca=0;
else q[i].l=out[u],q[i].r=in[v],q[i].lca=in[w];
}
std::sort(q+1,q+1+m);
tm[0]=N;
for(int l=1,r=0,i=1; i<=m; ++i)
if(!Ans[q[i].id])
{
while(l<q[i].l) Calc(seq[l++]);
while(l>q[i].l) Calc(seq[--l]);
while(r<q[i].r) Calc(seq[++r]);
while(r>q[i].r) Calc(seq[r--]);
if(q[i].lca) Calc(q[i].lca);
if(tm[q[i].x]&&tm[q[i].y]&&q[i].x&&q[i].y) Ans[q[i].id]=Now-1;
else Ans[q[i].id]=Now;
if(q[i].lca) Calc(seq[q[i].lca]);
}
for(int i=1; i<=m; ++i) printf("%d\n",Ans[i]); return 0;
}

BZOJ.3757.苹果树(树上莫队)的更多相关文章

  1. 【BZOJ 3735】苹果树 树上莫队(树分块+离线莫队+鬼畜的压行)

    2016-05-09 UPD:学习了新的DFS序列分块,然后发现这个东西是战术核导弹?反正比下面的树分块不知道要快到哪里去了 #include<cmath> #include<cst ...

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

    树上莫队共有三种写法: 1.按DFS序列分块,和普通莫队类似.常数大,不会被卡. 2.按块状树的方式分块.常数小,会被菊花图卡到O(n). 3.按[BZOJ1086]王室联邦的方式分块.常数小,不会被 ...

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

    3757: 苹果树 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1305  Solved: 503[Submit][Status][Discuss] ...

  4. [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】

    题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之 ...

  5. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  6. BZOJ3757: 苹果树【树上莫队】

    Description ​ 神犇家门口种了一棵苹果树.苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条.由于这棵苹果树 ...

  7. BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]

    传送门 题意: 单点修改,求一条链的mex 分块维护权值,$O(1)$修改$O(S)$求mex...... 带修改树上莫队 #include <iostream> #include < ...

  8. 2018.09.16 bzoj3757: 苹果树(树上莫队)

    传送门 一道树上莫队. 先用跟bzoj1086一样的方法给树分块. 分完之后就可以莫队了. 但是两个询问之间如何转移呢? 感觉很难受啊. 我们定义S(u,v)" role="pre ...

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

    点此看题面 大致题意: 每次问你树上两点之间路径中有多少种颜色,每次询问可能会将一种颜色\(a\)看成\(b\). 树上莫队 这题是一道树上莫队板子题. 毕竟求区间中有多少种不同的数是莫队算法的经典应 ...

随机推荐

  1. Hibernate5.4的环境搭建

    (1)项目中添加Hibernate依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId&g ...

  2. error: Apache shutdown unexpectedly.

    本地前端xmapp apache突然不能启动了, 报错 15:36:48 [Apache] Error: Apache shutdown unexpectedly.15:36:48 [Apache] ...

  3. win10安装virtualBox创建CentOS6.5虚拟机

    1.安装virtualBox 1.1.下载安装包,安装 搜索一下,或者去 VirtualBox官网下载一个. 下载第一个,兼容64,32位. 2.创建64位虚拟机 2.1.解决无法创建64位的问题 2 ...

  4. oracle客户端安装

    一.引导安装并配置 1)下载客户端(两个文件) 2)选中两个压缩包解压到同一个文件夹下 3)点击setup 4)选择:创建和配置数据库桌面类选择安装目录,全局数据库名:orcl,密码admin口令管理 ...

  5. Project Euler Problem9

    Special Pythagorean triplet Problem 9 A Pythagorean triplet is a set of three natural numbers, a  b  ...

  6. 转载:获取Nginx源码(1.3.5)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19616.html 可以在Nginx官方网站(http://nginx.org/en/download.html)获取Nginx源码包 ...

  7. springboot:session集中存储到redis

    1.在web工程的基础上,在pom.xml中添加: <dependency> <groupId>org.springframework.boot</groupId> ...

  8. 详解Android属性动画

    前面我们讲到的属性动画都是使用代码的定义方式:Android属性动画之ValueAnimator和Android属性动画之ObjectAnimator和AnimatorSet,下面我们再来看看使用XM ...

  9. javascript判断是用什么设备打开

    var userAgentInfo = navigator.userAgent //查看浏览器用于 HTTP 请求的用户代理头的值 var agents = ["Android", ...

  10. Math对象应用详解

    JavaScript中的Math对象提供了大量的算术运算功能和数值操作方法. JavaScript中的Math对象的与众不同之处在于,它是一个全局对象.在使用Math对象之前,既不需要将一个变量声明为 ...