树上莫队模板题。

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

之后莫队维护即可。不要忘记特判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. 从输入URL到页面加载到底发生了什么

    很多初学网络或者前端的初学者大多会有这样一个疑问:从输入URL到页面加载完成到底发生了什么?总的来说,这个过程分为下面几个步骤:1.DNS解析2.与服务器建立连接3.服务器处理并返回http报文4.浏 ...

  2. hdu 6206 : Apple 【计算几何 + 分数类】

    题目链接 比赛时C++上__float128都被卡精度,然后扔给队友用Java的BigDecimal过了 算法不多说,求三角形外心可以参考 维基百科 https://zh.wikipedia.org/ ...

  3. delphi exec error 错误处理

    有时引用了三方jar后报错 [Exec Error] The command "PATH ..."" exited with code 1 解决方法 1.检测jar文件路 ...

  4. 用 IDEA工具导入SVN项目。 步骤一:选择VCS

    Intellij IDEA是目前主流的IDE开发工具,工程项目导入也是必不可少的操作,本文讲述如何用 IDEA工具导入SVN项目. 步骤一:选择VCS 步骤二:打开SVN Repositories 在 ...

  5. 接口返回[object,Object]解决方法

    1.我们请求接口时有时会返回[object,Object],[object,Object],[object,Object].... 这个我们使用JSON.stringfity(data),就可以解决.

  6. Bellman-ford算法、SPFA算法求解最短路模板

    Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...

  7. HDU 5687 Problem C ( 字典树前缀增删查 )

    题意 : 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词 3.search: ...

  8. Go简易分布式对象存储 合并文件的所有分块为一个文件

    项目 项目地址: https://github.com/Draymonders/cloud 欢迎大家Watch or Star 缘由 由于项目中对大文件进行5MB为一个分块上传(多线程,提升上传效率) ...

  9. opencv入门教程三

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  10. 【转】DataRow复制一行到另一个DataTable

     源地址:http://www.cnblogs.com/pains/archive/2007/11/22/969003.html   下面两个方法是DataRow复制一行到另一个DataTable的, ...