昨天教练布置的莫队作业,然后一看我老早就用 DSU on tree 切了,来补题解(

题意

静态树询问子树中,同一种元素的数量不小于 \(k\) 的元素有多少种。

莫队做法

容易观察到子树在 \(\rm DFS\) 序上是一段连续的区间,于是问题就转化成了区间。

维护一个桶来记录有多少种元素在区间中有 \(x\) 个,在更新的时候注意是否等于 \(k\) 即可。

DSU on tree做法

同样维护一个桶,记录同样的东西,判定也是同样的。

所以 DSU on tree 就是复杂度为 Polylog 的莫队?(大雾)

code:(只写了 DSU on tree)

#include<cstdio>
const int M=1e5+5;
int n,m,Son,f[M],siz[M],son[M],col[M],num[M],cnt[M];
struct Edge{
int to;Edge*nx;
}e[M<<1],*h[M],*qwq=e;
struct Q{
int k,ans;Q*nx;
}q[M],*t[M],*tot=q+1;
inline void Add(const int&u,const int&v){
*qwq=(Edge){v,h[u]};h[u]=qwq++;
*qwq=(Edge){u,h[v]};h[v]=qwq++;
}
void DFS(int u){
siz[u]=1;
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v==f[u])continue;
f[v]=u;DFS(v);siz[u]+=siz[v];
if(siz[v]>siz[son[u]])son[u]=v;
}
}
void change(int u,bool keep){
if(keep)++cnt[++num[col[u]]];
else --cnt[num[col[u]]--];
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v==f[u]||v==Son)continue;
change(v,keep);
}
}
void Query(int u,bool keep){
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v==f[u]||v==son[u])continue;
Query(v,false);
}
if(son[u])Query(son[u],true),Son=son[u];
change(u,true);Son=0;
for(Q*E=t[u];E;E=E->nx)E->ans=cnt[E->k];
if(!keep)change(u,false);
}
signed main(){
register int i,u,v;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)scanf("%d",col+i);
for(i=1;i<n;++i)scanf("%d%d",&u,&v),Add(u,v);
for(i=1;i<=m;++i)scanf("%d%d",&u,&tot->k),tot->nx=t[u],t[u]=tot++;
DFS(1);Query(1,true);
for(i=1;i<=m;++i)printf("%d\n",q[i].ans);
}

CF375D题解的更多相关文章

  1. CF375D Tree and Queries 题解

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

  2. 【题解】 Luogu CF375D Tree and Queries

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

  3. 题解 CF375D 【Tree and Queries】

    首先,子树上的查询问题可以通过$DFS$序转为序列问题 再一看,没有修改,可以离线,这不就是莫队吗? 我们用$sum_i$表示出现次数$\geq i$的个数 用$val_i$表示第$i$种颜色的出现次 ...

  4. 【题解】CF375D Tree and Queries

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

  5. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  6. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  7. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  8. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  9. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

随机推荐

  1. 深入了解Element Form表单动态验证问题 转载

    随风丶逆风 2020-04-03 15:36:41  2208  收藏 3 分类专栏: Vue 随笔 文章标签: 动态验证 el-form elementUI 表单验证 版权 在上一篇<vue ...

  2. Linux-标准输入标准输出

    标准输入(代码为0) 标准输出(代码为1) 标准错误输出(代码为2) 将标准输出重定向到一个文件 find /etc -name fileA >list 等同于 find /etc -name ...

  3. NSURL组成部分详解

    手思中有这么一段代码,初看下,让人摸不着头脑 //功能:UIWebView响应长按事件 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithR ...

  4. jsp中<%@ taglib prefix="s" uri="/struts-tags"%>标签意思

    @taglib表明引用标签.类似java中的import语句prefix="s" 引用的名称在页面可以使用,就像java中生成的一个对象名,以后调用的时候直接使用<s:xxx ...

  5. 帆软报表(finereport)单元格函数,OP参数

    单元格模型:单元格数据和引用:数据类型.实际值与显示值.单元格支持的操作单元格样式:行高列宽.隐藏行列.自动换行.上下标.文字竖排.大文本字段分页时断开.标识说明.格式刷单元格Web属性:web显示. ...

  6. 基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版

    技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...

  7. 03 前端基础之JavaScript

    目录 前端基础之JavaScript JavaScript JavaScript注释 变量与常量 基本数据类型 number类型 string类型 boolean类型 null与undefined类型 ...

  8. Python语法进阶(1)- 进程与线程编程

    1.进程与多进程 1.1.什么是进程 进程就是程序执行的载体 什么叫多任务? 多任务就是操作系统可以同时运行多个任务.比如你一边在用浏览器学习,还一边在听音乐,,这就是多任务,至少同时有3个任务正在运 ...

  9. [LeetCode]1389. 按既定顺序创建目标数组

    给你两个整数数组 nums 和 index.你需要按照以下规则创建目标数组: 目标数组 target 最初为空. 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组 ...

  10. centos7对外开放端口号

    前提:防火墙处于打开状态 1:查看防护墙启动状态:systemctl  status firewalld 2:开启:systemctl start firewalld 3:关闭:systemctl s ...