Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)
题目链接 Tree and Queries
题目大意 给出一棵树和每个节点的颜色。每次询问$vj, kj$
你需要回答在以$vj$为根的子树中满足条件的的颜色数目,
条件:具有该颜色的节点数量至少为$kj$。
(莫队居然可以过)
首先转$DFS$序,这样就变成了区间查询。
然后直接套用莫队,求出每次询问状态下的$t[],t[k]$表示当前区间内拥有$k$个节点的颜色数量。
然后统计$t[k] + t[k + 1], ..., t[MAX]$即可,这个过程用树状数组维护。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 1e5 + 10;
const int d = N + 10; int b[N], c[N * 3], f[N];
int in[N], out[N];
int a[N], belong[N];
int n, m, ti = 0, bs = 0;
int l, r;
int ans[N];
vector <int> v[N]; struct node{
int v, k, id;
int l, r;
friend bool operator < (const node &a, const node &b){
return belong[a.l] == belong[b.l] ? a.r < b.r : belong[a.l] < belong[b.l];
}
} q[N]; inline void update(int x, int val){
for (; x <= (N * 3 - 10); x += x & -x) c[x] += val; } inline int query(int x){
if (x == 0) return c[x];
int ret = 0;
for (; x; x -= x & -x) ret += c[x];
return ret;
} void dfs(int x, int fa){
in[x] = ++ti;
for (auto u : v[x]){
if (u == fa) continue;
dfs(u, x);
}
out[x] = ti;
} int main(){ scanf("%d%d", &n, &m);
rep(i, 1, n) scanf("%d", a + i);
rep(i, 2, n){
int x, y;
scanf("%d%d", &x, &y);
v[x].push_back(y);
v[y].push_back(x);
} dfs(1, 0); rep(i, 1, n) b[in[i]] = i; rep(i, 1, m){
scanf("%d%d", &q[i].v, &q[i].k);
q[i].id = i;
q[i].l = in[q[i].v];
q[i].r = out[q[i].v];
} bs = sqrt(n);
rep(i, 1, n) belong[i] = (i - 1) / bs + 1;
sort(q + 1, q + m + 1); update(d, n); l = 1, r = 0; rep(i, 1, m){
while (l > q[i].l){
--l;
update(f[a[b[l]]] + d, -1);
++f[a[b[l]]];
update(f[a[b[l]]] + d, 1);
} while (l < q[i].l){
update(f[a[b[l]]] + d, -1);
--f[a[b[l]]];
update(f[a[b[l]]] + d, 1);
++l;
} while (r < q[i].r){
++r;
update(f[a[b[r]]] + d, -1);
++f[a[b[r]]];
update(f[a[b[r]]] + d, 1);
} while (r > q[i].r){
update(f[a[b[r]]] + d, -1);
--f[a[b[r]]];
update(f[a[b[r]]] + d, 1);
--r;
}
ans[q[i].id] = max(0, query(N * 3 - 10) - query(q[i].k - 1 + d));
} rep(i, 1, m) printf("%d\n", ans[i]);
return 0;
}
Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)的更多相关文章
- Codeforces 375D - Tree and Queries(dfs序+莫队)
题目链接:http://codeforces.com/contest/351/problem/D 题目大意:n个数,col[i]对应第i个数的颜色,并给你他们之间的树形关系(以1为根),有m次询问,每 ...
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
- 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)
点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...
- bzoj3236 作业 莫队+树状数组
莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ_3289_Mato的文件管理_莫队+树状数组
BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...
- BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块
题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- 51nod 1290 Counting Diff Pairs | 莫队 树状数组
51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...
- HihoCoder 1488 : 排队接水(莫队+树状数组)
描述 有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟. 由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小. 小 ...
随机推荐
- 如何用纯 CSS 创作一个文本淡入淡出的 loader 动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ERwpeG 可交互视频 ...
- php 常用函数集合(持续更新中...)
php 常用函数集合 在php的开发中,巧妙的运用php自带的一些函数,会起到事半功倍的效果,在此,主要记录一些常用的函数 1.time(),microtime()函数 time():获取当前时间戳 ...
- 初级练手项目——用Python一步一步实现“智能”贪吃蛇!
贪吃蛇作为一款经典的小游戏,想必大家一定并不陌生,今天我们就来用Python来设计与实现贪吃蛇游戏,回味一下童年的快乐.快跟着小编来看看吧! 基本环境配置 ●版本:Python3 ●系统:Wind ...
- LeetCode(219) Contains Duplicate II
题目 Given an array of integers and an integer k, find out whether there are two distinct indices i an ...
- 评估后Vista时代系统内核模式安全性
Windows Vista与之前的MS Windows版本(包括WindowsXPSP2)相比增加了很多的安全性.Vista新安全性的特征可以包括以下几个方面: 驱动签名 路径保护 内核模式代码完整性 ...
- jdk生成证书,网站请求变成https
生成证书的步骤 1.进入jdk的bin目录 keytool -genkey -alias tomcat -keyalg RSA 命名证书的名字叫tomcat 2.将证书拷贝至tomcat的bin目 ...
- 浅谈我所见的CSS命名风格
在两年工作中,总结一下我所见的css命名风格. 1.单一class命名 .header { width: 500px; } .item { text-indent: 20%; } 优点:简单,渲染效率 ...
- 国内外移动端web适配屏幕方案总结
基础知识点 设备像素:设备像素又称物理像素(physical pixel),设备能控制显示的最小单位,我们可以把这些像素看作成显示器上一个个的点. iPhone5的物理像素是640X1136. PS: ...
- 触屏版轻量级分页插件jqPagination分享
说到HTML5和jquery上的分页问题,优秀的分页插件网上一抓一大把,然而同时适合兼容在Ipad和手机端的网站分页却不是特别多. 或许有人会说,触屏现在流行下拉底部后加载下一页内容,类似微博和QQ空 ...
- Leetcode 476.数字的补数
数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位. 示例 1: 输入: 5 输出: 2 解 ...