CF375D Tree and Queries 题解
感觉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序,跑普通莫队即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
#define gc() (p1 == p2 ? (p2 = buf + fread(p1 = buf, 1, 1 << 20, stdin), p1 == p2 ? EOF : *p1++) : *p1++)
#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; })
char buf[1 << 20], *p1, *p2;
struct node{
int to,next;
}edge[maxn<<1];
int n,cnt,Time,m,ss;
int size[maxn],head[maxn],dfn[maxn],a[maxn],w[maxn],belong[maxn],sum[maxn],res[maxn],val[maxn];
struct Q{
int l,r,data,k;
}b[maxn];
void add(int from,int to){
edge[++cnt].to=to;
edge[cnt].next=head[from];
head[from]=cnt;
}
void dfs1(int u,int f){
size[u]=1;
dfn[u]=++Time;
w[Time]=a[u];
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==f) continue;
dfs1(v,u);
size[u]+=size[v];
}
}
bool cmp(Q x,Q y){
return belong[x.l]!=belong[y.l] ? x.l<y.l : belong[x.l]&1 ? x.r<y.r : x.r>y.r ;
}
void Solve(){
n=read(); m=read();
ss=sqrt(n);
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=n;++i) belong[i]=(i-1)/ss+1;
for(int i=1,x,y;i<n;++i) {
x=read();
y=read();
add(x,y);
add(y,x);
}
dfs1(1,0);
for(int i=1,x;i<=m;++i){
x=read();
b[i].k=read();
b[i].data=i;
b[i].l=dfn[x];
b[i].r=dfn[x]+size[x]-1;
}
sort(b+1,b+m+1,cmp);
int l=1,r=0,ans=0;
for(int i=1;i<=m;++i){
while(l>b[i].l){
--l;
val[w[l]]++;
sum[val[w[l]]]++;
}
while(r<b[i].r){
++r;
val[w[r]]++;
sum[val[w[r]]]++;
}
while(l<b[i].l){
sum[val[w[l]]]--;
val[w[l]]--;
l++;
}
while(r>b[i].r){
sum[val[w[r]]]--;
val[w[r]]--;
r--;
}
res[b[i].data]=sum[b[i].k];
}
for(int i=1;i<=m;++i) printf("%d\n",res[i]);
}
int main(){
Solve();
return 0;
}
CF375D Tree and Queries 题解的更多相关文章
- 【题解】 Luogu CF375D Tree and Queries
原题传送门 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 我博客中对莫队的详细介绍 莫队好题 我一上来想写线段树,随后觉得不好写并弃坑 我们可以看见没有修改操作,钦定莫队 但这是在树上,所以不能 ...
- 【题解】CF375D Tree and Queries
Link \(\text{Solution:}\) 讲实话这题有点烦,不知道为啥改了下\(\text{dfs}\)就过了--原版本\(dfs\)好像没啥错啊-- 其实对于子树问题,我们求出原来树的\( ...
- CF375D Tree and Queries
题意翻译 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. 感谢@elijahqi 提供的翻译 ...
- 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++) 调了两个小时 这题要求维护& ...
- 「CF375D Tree and Queries」
题目 \(dsu\ on\ tree\)的板子题了 \(dsu\ on\ tree\)本质上一种优秀通过轻重链剖分优化到\(O(nlogn)\)的暴力 一般用来解决没有修改的允许离线的子树查询问题 首 ...
- cf375D. Tree and Queries(莫队)
题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...
- [Codeforces Round #221 (Div. 1)][D. Tree and Queries]
题目链接:375D - Tree and Queries 题目大意:给你一个有n个点的树,每个点都有其对应的颜色,给出m次询问(v,k),问v的子树中有多少种颜色至少出现k次 题解:先对所有的询问进行 ...
- CodeForces 375D Tree and Queries 莫队||DFS序
Tree and Queries 题意:有一颗以1号节点为根的树,每一个节点有一个自己的颜色,求出节点v的子数上颜色出现次数>=k的颜色种类. 题解:使用莫队处理这个问题,将树转变成DFS序区间 ...
- Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)
题目链接 Tree and Queries 题目大意 给出一棵树和每个节点的颜色.每次询问$vj, kj$ 你需要回答在以$vj$为根的子树中满足条件的的颜色数目, 条件:具有该颜色的节点数量至少 ...
随机推荐
- sass和js的联动(共享变量)
一般做共享变量用于主题功能 假设我们在xxx.scss中声明了一个 theme:blue,我们在 js 中该怎么获取这个变量呢?我们可以通过import variables from '@/style ...
- vue 输入框内容控制
只能输入数字 <el-input onkeyup="value=value.replace(/[^\d]/g,'')" v-model.number="a" ...
- 如何在云效流水线 Flow中构建属于自己的NPM仓库
如何在云效流水线 Flow中构建属于自己的NPM仓库,Flow 通过各种构建组件,对各种语言提供了制品打包能力,让用户可以快速的使用流水线构建制品,并通过后续的部署任务进行部署.Flow 已经完成了与 ...
- node实战小例子
第一章 2020-2-6 留言小本子 思路(由于本章没有数据库,客户提交的数据放在全局变量,接收请求用的是bodyParser, padyParser使用方法 app.use(bodyParser.u ...
- js简单化技巧
1.交换两个变量而没有第三个 let x = 1;let y = 2;[x, y] = [y, x];console.log(x, y); 输出: 2 1 2.将数字转换为字符串 const num ...
- 字符串出现的topK问题
/** * return topK string * @param strings string字符串一维数组 strings * @param k int整型 the k * @return str ...
- dede5.7 标题长度限制修改
我们经常碰到dede标题长度不够用的问题20个字的标题有时候是真的有点短了网上也有些修改长度问题的帖子,但我发现都不完整所以写下来供大家参考下.免得浪费时间 第一步: 修改下面4处文件: dede目录 ...
- Linux系列(34) - yum源文件(1)
yum源文件各参数含义 在[/etc/yum.repos.d/]目录中,默认有4个yum源文件,其中[CentOS-Linux-BaseOS.repo]是基本yum源文件,如果我们能上网,那它是默认生 ...
- navicat导出DDL语句
工作中有的时候需要将某个库中的表.视图.函数.存储过程等创建语句导出,又不需要表中的数据. 方法一:需要拷贝的创建语句条数不多,可以选择直接拷贝DDL语句 方法二:使用Navicat的备份功能
- 没想到 TCP 协议,还有这样的骚操作。。。
大家好,我是小林. 昨晚有位读者问了我这么个问题: 大概意思是,一个已经建立的 TCP 连接,客户端中途宕机了,而服务端此时也没有数据要发送,一直处于 establish 状态,客户端恢复后,向服务端 ...