cf375D. Tree and Queries(莫队)
题意
题目链接
给出一棵 n 个结点的树,每个结点有一个颜色 c i 。 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种。树的根节点是1。
Sol
想到了主席树和启发式合并。。很显然都不能做。
标算是dfs序上暴力莫队。。甘拜下风
具体实现的时候可以直接用\(tim[i]\)表示第\(i\)个颜色的出现次数,\(ans[i]\)表示出现次数多于\(i\)的颜色的种类
由于左右端点移动的时候只会对一个\(ans[i]\)产生影响,所以修改是\(O(1)\)的
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int N, M, dfn[MAXN], rev[MAXN], tot, block, bel[MAXN], siz[MAXN], col[MAXN], tims[MAXN], Ans[MAXN], out[MAXN];
vector<int> v[MAXN];
struct Query{int id, l, r, k;bool operator < (const Query &rhs) const {return bel[l] == bel[rhs.l] ? r < rhs.r : bel[l] < bel[rhs.l];}
}Q[MAXN];
void dfs(int x, int fa) {dfn[x] = ++tot; rev[tot] = x; siz[x] = 1;for(int i = 0, to; i < v[x].size(); i++) {if((to = v[x][i]) == fa) continue;dfs(to, x); siz[x] += siz[to];}
}
void add(int x, int opt) {if(opt == 1) Ans[++tims[x]]++;else Ans[tims[x]--]--;
}
void solve() { sort(Q + 1, Q + M + 1);int l = 1, r = 0;for(int i = 1; i <= M; i++) {while(r > Q[i].r) add(col[rev[r--]], -1);while(r < Q[i].r) add(col[rev[++r]], 1);while(l < Q[i].l) add(col[rev[l++]], -1);while(l > Q[i].l) add(col[rev[--l]], 1);out[Q[i].id] = Ans[Q[i].k];///printf("%d\n", out[Q[i].id]);}for(int i = 1; i <= M; i++) printf("%d\n", out[i]);}
int main() {N = read(); M = read(); block = sqrt(N);for(int i = 1; i <= N; i++) col[i] = read(), bel[i] = (i - 1) / block + 1;for(int i = 1; i <= N - 1; i++) {int x = read(), y = read();v[x].push_back(y); v[y].push_back(x);} dfs(1, 0);for(int i = 1; i <= M; i++) {Q[i].id = i; int x = read(); Q[i].k = read();Q[i].l = dfn[x];Q[i].r = dfn[x] + siz[x] -1;}solve();return 0;
}
/*
*/
cf375D. Tree and Queries(莫队)相关推荐
- cf375D. Tree and Queries
cf375D. Tree and Queries 题意: 给你一颗有根树,每个点都有一个颜色,有m次询问,问以u为根的子树中,相同颜色数量超过k的有多少种颜色? 题解: 这个题做法很多,有莫队分块,这 ...
- 【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)
文章目录 问题引入 介绍莫队算法及其实现过程 时间复杂度 莫队算法适用范围 莫队奇偶优化 普通莫队:小B的询问 树上莫队:SP10707 COT2 - Count on a tree II 回滚莫队: ...
- CF375D Tree and Queries(dsu on tree)
题解: 个人感觉这个题目是一个挺不错的题的.(这里就不说dsu on tree的这个过程是什么了) 我们在dsu on tree计算答案时需要有一个小小技巧去优化一下时间复杂度. 就是当我们用一个cn ...
- Codeforces 375D - Tree and Queries(dfs序+莫队)
题目链接:http://codeforces.com/contest/351/problem/D 题目大意:n个数,col[i]对应第i个数的颜色,并给你他们之间的树形关系(以1为根),有m次询问,每 ...
- 【SPOJ】Count On A Tree II(树上莫队)
[SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...
- 【SPOJ COT2】Count on a tree II,树上莫队
Time:2016.09.07 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 第一次写树上莫队 被char哥怒裱一通 实际上还是比较简单的 序列的相关维护问题转移到树上一般都要涉及 ...
- SP10707 COT2 - Count on a tree II【树上莫队】
传送门 给定一颗无根树,求树上两点路径上的节点有多少不同的数字 可以离线 分析 前提,能够通过某种操作,将树上路径问题,转化成区间问题 这样,类似于求区间不同数,区间众数,区间mex等操作就能通过莫队 ...
- 曼哈顿距离最小生成树莫队算法
参考资料:https://www.cnblogs.com/CsOH/p/5904430.html https://blog.csdn.net/huzecong/article/details/8576 ...
- hdu 4676 Sum Of Gcd 莫队+phi反演
Sum Of Gcd 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4676 Description Given you a sequence of ...
最新文章
- js 输出中文乱码 解决办法
- File System Filter Driver Tutorial
- iview代码片段 去除水平menu底部横线
- 做中学之教与学工具箱
- idea中的一个子模块中的pom文件带横线、maven为灰色
- HTML vs XHTML vs DHTML
- 虚拟机ubuntu 网速慢的解决方法
- 彻底搞懂 MySQL 事务的隔离级别
- 特征选择和共线性问题
- 编程语言c语言vb,c语言和vb语言哪个比较简单
- 计算机端口错误678,Win8宽带连接出现错误678的解决方法
- 测试人必备的工具(常用的测试平台)
- 功能测试Ⅲ——缺陷及缺陷管理
- BZOJ3557: [Ctsc2014]随机数
- 操作系统学习-1. 操作系统的目标和作用
- 港科夜闻|香港科大海洋科学系主任兼讲座教授钱培元:成立产业推广部抢商机...
- 机器学习与R之朴素贝叶斯分类器
- 知乎电商创业准备_你准备参加早期创业了吗
- 干货分享:智慧工厂时代下大数据 + 智能的深度实践
- 虚拟服务器路由器当交换机可以吗,怎么把无线路由器设置成无线交换机_路由器当交换机怎么设置方法-192路由网...
热门文章
- 多线程:管cheng法
- 数组:三种初始化及内存分析
- Linux服务器硬盘更换,[ Linux ] 服务器更换硬盘
- hook控制浏览器的方法_Java-Hook技术-入门实践+反射、动态代理、热修复再看看
- 七乐彩中奖规则表_【开奖】双色球第2020094期开奖结果出炉!你中奖了吗?
- 大专计算机应用技术答辩,计算机应用技术专业硕士答辩.ppt
- android蓝牙串口 hc06,Android手机通过蓝牙模块HC-06连接Arduino串口输出
- mysql 5.7 window x64_window环境配置Mysql 5.7.21 windowx64.zip免安装版教程详解
- linux tcb,在Linux中从潜藏密码迁移至tcb怎么做?
- mysql数据存储到指定位置_Mysql数据库表分区存储到指定磁盘路径