感觉CF的题目名都好朴素的样子

你谷链接

首先这题显然是个dsu on tree 但是我不会。

其次这题显然是个莫队。这我会啊!

然后会发现好像不是很对劲。因为每次询问都有一个k,貌似和传统的莫队数颜色有点不一样。

本蒟蒻看到这里的时候内心是崩溃的。然后就看了一眼题解

然后我就迷惑了。震惊,前缀和还可以O(1)修改,活到爆!

然后经过郭神的一番论证以后,我惊讶的发现,这个题还真能O(1)修改前缀和。

首先,两个数组。sum[i]表示出现次数大于i的颜色的数量。val[i]表示颜色i的出现次数。

那么考虑莫队做法,当上一个询问的答案转移到当下的答案时,我们假设颜色i的数量要++。那么sum[val[i]+1]++;

但是会发现,出现次数是(val[i]+1)的颜色数量+1,而对应的,出现次数是(val[i])的颜色数量就要-1。也就是说,每次对颜色的修改,只会涉及到sum数组的单点,而不会涉及到前缀(或后缀)。

弄清楚这个,代码就很简单了。做个dfn序,跑普通莫队即可。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=100000+10;
  4. #define gc() (p1 == p2 ? (p2 = buf + fread(p1 = buf, 1, 1 << 20, stdin), p1 == p2 ? EOF : *p1++) : *p1++)
  5. #define read() ({ register int x = 0, f = 1; register char c = gc(); while(c < '0' || c > '9') { if (c == '-') f = -1; c = gc();} while(c >= '0' && c <= '9') x = x * 10 + (c & 15), c = gc(); f * x; })
  6. char buf[1 << 20], *p1, *p2;
  7. struct node{
  8. int to,next;
  9. }edge[maxn<<1];
  10. int n,cnt,Time,m,ss;
  11. int size[maxn],head[maxn],dfn[maxn],a[maxn],w[maxn],belong[maxn],sum[maxn],res[maxn],val[maxn];
  12. struct Q{
  13. int l,r,data,k;
  14. }b[maxn];
  15. void add(int from,int to){
  16. edge[++cnt].to=to;
  17. edge[cnt].next=head[from];
  18. head[from]=cnt;
  19. }
  20. void dfs1(int u,int f){
  21. size[u]=1;
  22. dfn[u]=++Time;
  23. w[Time]=a[u];
  24. for(int i=head[u];i;i=edge[i].next){
  25. int v=edge[i].to;
  26. if(v==f) continue;
  27. dfs1(v,u);
  28. size[u]+=size[v];
  29. }
  30. }
  31. bool cmp(Q x,Q y){
  32. return belong[x.l]!=belong[y.l] ? x.l<y.l : belong[x.l]&1 ? x.r<y.r : x.r>y.r ;
  33. }
  34. void Solve(){
  35. n=read(); m=read();
  36. ss=sqrt(n);
  37. for(int i=1;i<=n;++i) a[i]=read();
  38. for(int i=1;i<=n;++i) belong[i]=(i-1)/ss+1;
  39. for(int i=1,x,y;i<n;++i) {
  40. x=read();
  41. y=read();
  42. add(x,y);
  43. add(y,x);
  44. }
  45. dfs1(1,0);
  46. for(int i=1,x;i<=m;++i){
  47. x=read();
  48. b[i].k=read();
  49. b[i].data=i;
  50. b[i].l=dfn[x];
  51. b[i].r=dfn[x]+size[x]-1;
  52. }
  53. sort(b+1,b+m+1,cmp);
  54. int l=1,r=0,ans=0;
  55. for(int i=1;i<=m;++i){
  56. while(l>b[i].l){
  57. --l;
  58. val[w[l]]++;
  59. sum[val[w[l]]]++;
  60. }
  61. while(r<b[i].r){
  62. ++r;
  63. val[w[r]]++;
  64. sum[val[w[r]]]++;
  65. }
  66. while(l<b[i].l){
  67. sum[val[w[l]]]--;
  68. val[w[l]]--;
  69. l++;
  70. }
  71. while(r>b[i].r){
  72. sum[val[w[r]]]--;
  73. val[w[r]]--;
  74. r--;
  75. }
  76. res[b[i].data]=sum[b[i].k];
  77. }
  78. for(int i=1;i<=m;++i) printf("%d\n",res[i]);
  79. }
  80. int main(){
  81. Solve();
  82. return 0;
  83. }

CF375D Tree and Queries 题解的更多相关文章

  1. 【题解】 Luogu CF375D Tree and Queries

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

  2. 【题解】CF375D Tree and Queries

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

  3. CF375D Tree and Queries

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

  4. 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++) 调了两个小时 这题要求维护& ...

  5. 「CF375D Tree and Queries」

    题目 \(dsu\ on\ tree\)的板子题了 \(dsu\ on\ tree\)本质上一种优秀通过轻重链剖分优化到\(O(nlogn)\)的暴力 一般用来解决没有修改的允许离线的子树查询问题 首 ...

  6. cf375D. Tree and Queries(莫队)

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

  7. [Codeforces Round #221 (Div. 1)][D. Tree and Queries]

    题目链接:375D - Tree and Queries 题目大意:给你一个有n个点的树,每个点都有其对应的颜色,给出m次询问(v,k),问v的子树中有多少种颜色至少出现k次 题解:先对所有的询问进行 ...

  8. CodeForces 375D Tree and Queries 莫队||DFS序

    Tree and Queries 题意:有一颗以1号节点为根的树,每一个节点有一个自己的颜色,求出节点v的子数上颜色出现次数>=k的颜色种类. 题解:使用莫队处理这个问题,将树转变成DFS序区间 ...

  9. Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)

    题目链接  Tree and Queries 题目大意  给出一棵树和每个节点的颜色.每次询问$vj, kj$ 你需要回答在以$vj$为根的子树中满足条件的的颜色数目, 条件:具有该颜色的节点数量至少 ...

随机推荐

  1. SpringBoot-异步定时-邮件任务

    目录 背景 异步任务 定时任务 邮件任务 背景 在我们的工作中,常常会用到异步处理任务,比如我们在网站上发送邮件, 后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功, 所以我们 ...

  2. Sentry Web 前端监控 - 最佳实践(官方教程)

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  3. weblogic获取应用目录路径

    一.背景说明 在项目开发过程中,本地开发用的windows+tomcat,到了生产中,就成了linux+weblogic.部署工程后,应用报错,显示获取应用目录返回为null. 在网上查阅资料,发现在 ...

  4. DebugView端游日志查看工具

    端游日志工具 端游开发的同学可以通过DebugView - Windows Sysinternals | Microsoft Docs来查看游戏打印的log,它允许你监控本地系统上的debug pri ...

  5. PHP脚本设置及获取进程名

    今天来学习的是两个非常简单的函数,一个可以用来设置我们执行脚本时运行的进程名.而另一个就是简单的获取当前运行的进程名.这两个函数对于大量的脚本运行代码有很大的作用,比如我们需要 kill 掉某个进程时 ...

  6. PHP的可变变量与可变函数

    什么叫可变.在程序世界中,可变的当然是变量.常量在定义之后都是不可变的,在程序执行过程中,这个常量都是不能修改的.但是变量却不同,它们可以修改.那么可变变量和可变函数又是什么意思呢?很明显,就是用另一 ...

  7. Docker系列(20)- 数据卷容器

    数据卷容器 什么是数据卷容器? 容器和容器之间实现数据共享 一个容器先于宿主机创建挂载方式,宿主机就会有改卷的目录 第二个容器使用命令--volumes-from 第一个容器,共享使用了第一个容器与宿 ...

  8. Linux系列(3) - ls

    作用 ls:查询目录中内容 格式 ls [选项] [文件或目录] 选项 描述 -a 显示所有文件,包括隐藏文件.隐藏文件是.开头的 -l 显示详细信息:ls -l简写为ll,使用频率很高 -d 查看目 ...

  9. Django边学边记—静态文件

    概念 项目中的CSS.图片.js都是静态文件 一般会将静态文件放到一个单独的目录中,以方便管理 在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径 静 ...

  10. AT1983-[AGC001E]BBQ Hard【dp,组合数学】

    正题 题目链接:https://www.luogu.com.cn/problem/AT1983 题目大意 给出\(n\)个数对\((a_i,b_i)\) 求 \[\sum_{i=1}^n\sum_{j ...