树上莫队模板题。

使用欧拉序将树上路径转化为普通区间。

之后莫队维护即可。不要忘记特判LCA

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 200005
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;
}
int n,m,val[N],inp[N],cnt[N],v[N],nxt[N],head[N],cntt,tot,siz,ord[N],ncnt,fir[N],lst[N];
int fa[N][],dep[N],now,l=,r=,ans[N],vis[N];
struct node
{
int l,r,x,lca;
}q[N];
bool cmp(node a,node b)
{
if(a.l/siz!=b.l/siz)return a.l/siz<b.l/siz;
return a.r<b.r;
}
void add(int a,int b)
{
v[++cntt]=b;
nxt[cntt]=head[a];
head[a]=cntt;
}
void dfs1(int x,int f)
{
dep[x]=dep[f]+;
for(int i=;i<=;i++)fa[x][i+]=fa[fa[x][i]][i];
for(int i=head[x];i;i=nxt[i])
{
if(v[i]==f)continue;
fa[v[i]][]=x;
dfs1(v[i],x);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)
{
if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
}
for(int i=;i>=;i--)
{
if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
}
return fa[x][];
}
void dfs2(int x,int f)
{
ord[++ncnt]=x;
fir[x]=ncnt;
for(int i=head[x];i;i=nxt[i])
{
if(v[i]==f)continue;
dfs2(v[i],x);
}
ord[++ncnt]=x;
lst[x]=ncnt;
}
void work(int pos)
{
if(vis[pos])now-=!--cnt[val[pos]];
else now+=!cnt[val[pos]]++;
vis[pos]^=;
}
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)val[i]=inp[i]=read();
sort(inp+,inp+n+);
tot=unique(inp+,inp+n+)-inp-;
for(int i=;i<=n;i++)val[i]=lower_bound(inp+,inp+tot+,val[i])-inp;
for(int x,y,i=;i<n;i++)
{
x=read();y=read();
add(x,y);add(y,x);
}
dfs1(,);dfs2(,);
for(int i=;i<=m;i++)
{
int ll=read(),rr=read(),LCA=lca(ll,rr);
if(fir[ll]>fir[rr])swap(ll,rr);
if(ll==LCA)
{
q[i].l=fir[ll];
q[i].r=fir[rr];
}
else
{
q[i].l=lst[ll];
q[i].r=fir[rr];
q[i].lca=LCA;
}
q[i].x=i;
}
siz=sqrt(ncnt);
sort(q+,q+m+,cmp);
for(int i=;i<=m;i++)
{
int ll=q[i].l,rr=q[i].r,Lca=q[i].lca;
while(l<ll)work(ord[l++]);
while(l>ll)work(ord[--l]);
while(r<rr)work(ord[++r]);
while(r>rr)work(ord[r--]);
if(Lca)work(Lca);
ans[q[i].x]=now;
if(Lca)work(Lca);
}
for(int i=;i<=m;i++)printf("%d\n",ans[i]);
return ;
}

[SPOJ]Count on a tree II(树上莫队)的更多相关文章

  1. spoj COT2 - Count on a tree II 树上莫队

    题目链接 http://codeforces.com/blog/entry/43230树上莫队从这里学的,  受益匪浅.. #include <iostream> #include < ...

  2. SP10707 COT2 - Count on a tree II (树上莫队)

    大概学了下树上莫队, 其实就是在欧拉序上跑莫队, 特判lca即可. #include <iostream> #include <algorithm> #include < ...

  3. SP10707 COT2 - Count on a tree II [树上莫队学习笔记]

    树上莫队就是把莫队搬到树上-利用欧拉序乱搞.. 子树自然是普通莫队轻松解决了 链上的话 只能用树上莫队了吧.. 考虑多种情况 [X=LCA(X,Y)] [Y=LCA(X,Y)] else void d ...

  4. SPOJ COT2 Count on a tree II 树上莫队算法

    题意: 给出一棵\(n(n \leq 4 \times 10^4)\)个节点的树,每个节点上有个权值,和\(m(m \leq 10^5)\)个询问. 每次询问路径\(u \to v\)上有多少个权值不 ...

  5. P4074 [WC2013]糖果公园 树上莫队带修改

    题目链接 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 nn 个游览点构 ...

  6. 【SPOJ】Count On A Tree II(树上莫队)

    [SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...

  7. SPOJ COT2 - Count on a tree II(LCA+离散化+树上莫队)

    COT2 - Count on a tree II #tree You are given a tree with N nodes. The tree nodes are numbered from  ...

  8. 「日常训练&知识学习」莫队算法(二):树上莫队(Count on a tree II,SPOJ COT2)

    题意与分析 题意是这样的,给定一颗节点有权值的树,然后给若干个询问,每次询问让你找出一条链上有多少个不同权值. 写这题之前要参看我的三个blog:Codeforces Round #326 Div. ...

  9. SPOJ COT2 Count on a tree II (树上莫队,倍增算法求LCA)

    题意:给一个树图,每个点的点权(比如颜色编号),m个询问,每个询问是一个区间[a,b],图中两点之间唯一路径上有多少个不同点权(即多少种颜色).n<40000,m<100000. 思路:无 ...

随机推荐

  1. vue开发移动端总结

    1.app.vue组件中,外层只能有一个div块,不能多个并列在一起. 正确: 错误: 2.main.js文件 3. app.vue文件 4. stroe.js 文件 5. router.js

  2. [CF1004E] Sonya and Ice-cream

    问题描述 Sonya likes ice cream very much. She eats it even during programming competitions. That is why ...

  3. JDK1.8 LinkedList双向链表源码

    序言 LinkedList是一个双向链表 也就是说list中的每个元素,在存储自身值之外,还 额外存储了其前一个和后一个元素的地址,所以也就可以很方便地根据当前元素获取到其前后的元素 链表的尾部元素的 ...

  4. Java——容器(Collection)

    Collection是一个接口,定义了一系列的方法.   [常见方法]  

  5. CodeForces 1198C 1199E Matching vs Independent Set

    Time limit 1000 ms Memory limit 262144 kB 这题是一场cf里,div1的第三题,div2的第5题 中文题意 给一张无向图,没说连通性,要你选出一个大小为n的匹配 ...

  6. Internet History, Technology, and Security(week8)——Security: Encrypting and Signing

    Hiding Date from Ohters Security Introduction Alice and Bob是密码学.博弈论.物理学等领域中的通用角色之一.Alice(代表A)和Bob(代表 ...

  7. mac 外接屏幕切换操作

    mac 屏幕小,可外接合适的屏幕扩展.接好屏幕后: 在 mac 系统变化中看到显示器字样, 点击排列,可以看到一个白色的条状色块,即为主屏幕.(镜像显示不能选中) 在 mac 怎么打开一个应用,在其中 ...

  8. Beauty Values

    Beauty Values 题意:给$n$个数, 定义它的Beauty Values为所有连续子区间的(区间长度*区间内不同数字的数目)求和 求Beauty Values A[i]数组表示数字i最近一 ...

  9. linux 文件相关常用命令

    文件或者目录操控命令 1,cd切换目录. 其中- 代表前一个目录 2,mkdir 新建目录. 加上-p参数可以递归创建多级目录 mkdir -p test1/test2/test3 3,rmdir删除 ...

  10. foreach(增强for循环)和for的区别

    https://www.cnblogs.com/XiaojianGo/p/7471860.html 首先说一下foreach有的也叫增强for循环,foreach其实是for循环的一个特殊简化版. 再 ...