题目

\(dsu\ on\ tree\)的板子题了

\(dsu\ on\ tree\)本质上一种优秀通过轻重链剖分优化到\(O(nlogn)\)的暴力

一般用来解决没有修改的允许离线的子树查询问题

首先先来处理出每一个节点的重儿子

接下来按照如下的顺序统计

  1. 递归处理当前节点的所有轻儿子

  2. 递归处理重儿子

  3. 遍历一遍整棵子树,统计信息(但是不用访问当前点的重儿子)

  4. 如果这个节点是重儿子,就返回,否则的话就清空所有信息

所以第三步,不用访问当前点的重儿子就是因为在第四步的时候重儿子没有被清空

至于这道题我们数颜色的时候开一个树状数组,每次存储颜色的桶数量发生变化,就在树状数组里修改相应的位置

查一个后缀和就好了

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define LL long long
  6. #define re register
  7. #define lowbit(x) ((x)&(-x))
  8. #define maxn 100005
  9. inline int read() {
  10. int x=0;char c=getchar();while(c<'0'||c>'9') c=getchar();
  11. while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
  12. }
  13. int n,m,num,__,Son,tot;
  14. struct Ask{int x,k,rk;}q[maxn];
  15. struct E{int v,nxt;}e[maxn<<1];
  16. int son[maxn],sum[maxn],deep[maxn],col[maxn];
  17. int dfn[maxn],c[maxn],tax[maxn],Ans[maxn],head[maxn];
  18. inline int cmp(Ask A,Ask B) {return dfn[A.x]<dfn[B.x];}
  19. inline void C(int x,int y) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;}
  20. inline void add(int x,int val) {for(re int i=x;i;i-=lowbit(i)) c[i]+=val;}
  21. inline int ask(int x) {int now=0;for(re int i=x;i<=n;i+=lowbit(i)) now+=c[i];return now;}
  22. void dfs1(int x) {
  23. sum[x]=1;int maxx=-1;
  24. for(re int i=head[x];i;i=e[i].nxt) {
  25. if(deep[e[i].v]) continue;
  26. deep[e[i].v]=deep[x]+1,dfs1(e[i].v);
  27. sum[x]+=sum[e[i].v];
  28. if(sum[e[i].v]>maxx) maxx=sum[e[i].v],son[x]=e[i].v;
  29. }
  30. }
  31. void dfs2(int x) {
  32. for(re int i=head[x];i;i=e[i].nxt)
  33. if(deep[e[i].v]>deep[x]&&son[x]!=e[i].v) dfs2(e[i].v);
  34. if(son[x]) dfs2(son[x]);
  35. dfn[x]=++__;
  36. }
  37. void calc(int x,int opt) {
  38. if(tax[col[x]]) add(tax[col[x]],-1);
  39. tax[col[x]]+=opt;
  40. if(tax[col[x]]) add(tax[col[x]],1);
  41. for(re int i=head[x];i;i=e[i].nxt)
  42. if(deep[e[i].v]>deep[x]&&Son!=e[i].v) calc(e[i].v,opt);
  43. }
  44. void dfs(int x,int opt) {
  45. for(re int i=head[x];i;i=e[i].nxt)
  46. if(deep[e[i].v]>deep[x]&&son[x]!=e[i].v)
  47. dfs(e[i].v,0);
  48. if(son[x]) dfs(son[x],1);
  49. Son=son[x];calc(x,1);Son=0;
  50. while(q[tot].x==x) {
  51. Ans[q[tot].rk]=ask(q[tot].k);tot++;
  52. }
  53. if(!opt) calc(x,-1);
  54. }
  55. int main() {
  56. n=read(),m=read();
  57. for(re int i=1;i<=n;i++) col[i]=read();
  58. for(re int x,y,i=1;i<n;i++) x=read(),y=read(),C(x,y),C(y,x);
  59. deep[1]=1,dfs1(1),dfs2(1);
  60. for(re int i=1;i<=m;i++) q[i].rk=i,q[i].x=read(),q[i].k=read();
  61. std::sort(q+1,q+m+1,cmp);tot=1;dfs(1,1);
  62. for(re int i=1;i<=m;i++) printf("%d\n",Ans[i]);
  63. return 0;
  64. }

「CF375D Tree and Queries」的更多相关文章

  1. CF375D Tree and Queries

    题意翻译 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. 感谢@elijahqi 提供的翻译 ...

  2. CF375D Tree and Queries(dsu on tree)

    思路 dsu on tree的板子,可惜人傻把 for(int i=fir[u];i;i=nxt[i]) 打成 for(int i=fir[u];i<=n;i++) 调了两个小时 这题要求维护& ...

  3. CF375D Tree and Queries 题解

    感觉CF的题目名都好朴素的样子 你谷链接 首先这题显然是个dsu on tree 但是我不会. 其次这题显然是个莫队.这我会啊! 然后会发现好像不是很对劲.因为每次询问都有一个k,貌似和传统的莫队数颜 ...

  4. 【题解】 Luogu CF375D Tree and Queries

    原题传送门 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 我博客中对莫队的详细介绍 莫队好题 我一上来想写线段树,随后觉得不好写并弃坑 我们可以看见没有修改操作,钦定莫队 但这是在树上,所以不能 ...

  5. cf375D. Tree and Queries(莫队)

    题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...

  6. 【题解】CF375D Tree and Queries

    Link \(\text{Solution:}\) 讲实话这题有点烦,不知道为啥改了下\(\text{dfs}\)就过了--原版本\(dfs\)好像没啥错啊-- 其实对于子树问题,我们求出原来树的\( ...

  7. #10471. 「2020-10-02 提高模拟赛」灌溉 (water)

    题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...

  8. 众安「尊享e生」果真牛的不可一世么?

    近日,具有互联网基因的.亏损大户(成立三年基本没盈利,今年二季度末亏损近4亿,你能指望它多厉害?).财产险公司—众安推出“尊享e生”中高端医疗保险(财险公司经营中高端医疗真的很厉害?真的是中高端医疗险 ...

  9. XCActionBar 「Xcode 中的 Alfred」

    下载地址:https://github.com/pdcgomes/XCActionBar 基本命令: (1)「command+shift+8」或者双击「command」键可以打开「动作输入框窗口」 ( ...

随机推荐

  1. Apache 反向代理 丢失Authorization

    我后端API的服务器是Tomcat,而后端API验证是通过存放在头部Authorization的token值进行验证的. 我在测试Apache作为前端html解析的服务器时, 利用反向代理,把Api请 ...

  2. OutSystems学习笔记。

    ew job and new software, new challenge as well. OutSystems这软件挺好上手的.虽然没有中文文档,但英文文档超级详细,堪称傻瓜版SOP 照着步骤写 ...

  3. 项目管理系列--谷歌的code review

    Google 开源项目风格指南 (中文版) 在线文档托管在 ReadTheDocs : 在线阅读最新版本 中文风格指南 GitHub 托管地址:zh-google-styleguide 声明. 本项目 ...

  4. List和Queue使用过程中的纪录

    业务需求: 发送特定的请求,根据返回的信息执行特定的事件. 目前的做法:把我的请求放入一个容器内,然后待到某一条件,就从这个容器把请求发送出去,等客户返回信息时,查询容器中对应请求中特定的事件.开始的 ...

  5. 手机UA识别

    整理手机UA识别如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  6. 【转】Encrypt ConnectionString in Web.Config 【加密ASP.NET web.config数据库链接字串】

    原文链接:https://www.codeproject.com/Tips/795135/Encrypt-ConnectionString-in-Web-Config web.config中一般会存放 ...

  7. 在JSP中将EXEL文件的数据传入到数据库中

    在jsp中: 在script中使用函数: $(function(){ //var lpyear = document.getElementById("lpyear").value; ...

  8. csharp: Aspose.Words create table

    /// <summary> /// 20141118 /// Geovin Du /// Aspose.Words创建表 /// </summary> /// <para ...

  9. html高度塌陷问题解决

    高度塌陷的问题: 当开启元素的BFC以后,元素将会有如下的特性 1 父元素的垂直外边距不会和子元素重叠    开启BFC的元素不会被浮动元素所覆盖    开启BFC的元素可以包含浮动的子元素 如何开启 ...

  10. C++类继承--基类析构函数加上Virtual

    下面的内容要说明两个问题:1. 基类的析构函数为什么要加上Virtual--防止内存泄露 1. 基类虚构函数无virtual,派生类无法析构,会导致内存泄露 #include <stdio.h& ...