题目大意:给定一棵 N 个节点的有根树,1 号节点为根节点,每个节点有一个颜色。有 M 个询问,每次询问以 i 为根的子树中颜色大于等于 K 的有多少种。

题解:子树询问直接 dfs 序转化成序列问题。同时注意到不带修改,且可以离线,直接莫队即可。

代码如下

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pb push_back
  5. #define mp make_pair
  6. #define all(x) x.begin(),x.end()
  7. #define cls(a,b) memset(a,b,sizeof(a))
  8. using namespace std;
  9. typedef long long ll;
  10. typedef pair<int,int> P;
  11. const int dx[]={0,1,0,-1};
  12. const int dy[]={1,0,-1,0};
  13. const int mod=1e9+7;
  14. const int inf=0x3f3f3f3f;
  15. const int maxn=1e5+10;
  16. const double eps=1e-6;
  17. inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  18. inline ll sqr(ll x){return x*x;}
  19. inline ll read(){
  20. ll x=0,f=1;char ch;
  21. do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
  22. do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
  23. return f*x;
  24. }
  25. /*--------------------------------------------------------*/
  26. vector<int> G[maxn];
  27. int n,m,cor[maxn],tot;
  28. int dfn[maxn],c[maxn],size[maxn],dfs_clk;
  29. int ans[maxn],cnt[maxn],sum[maxn];
  30. struct node{int l,r,bl,id,k;}q[maxn];
  31. bool cmp(const node &a,const node &b){
  32. return a.bl!=b.bl?a.bl<b.bl:(a.bl&1)?a.r<b.r:a.r>b.r;
  33. }
  34. void dfs(int u,int fa){
  35. dfn[u]=++dfs_clk,size[u]=1,c[dfs_clk]=cor[u];
  36. for(auto v:G[u]){
  37. if(v==fa)continue;
  38. dfs(v,u);
  39. size[u]+=size[v];
  40. }
  41. }
  42. void read_and_parse(){
  43. n=read(),m=read(),tot=sqrt(n);
  44. for(int i=1;i<=n;i++)cor[i]=read();
  45. for(int i=1;i<n;i++){
  46. int x=read(),y=read();
  47. G[x].pb(y),G[y].pb(x);
  48. }
  49. dfs(1,0);
  50. for(int i=1;i<=m;i++){
  51. int rt=read();q[i].k=read();
  52. q[i].l=dfn[rt],q[i].r=dfn[rt]+size[rt]-1,q[i].id=i,q[i].bl=(q[i].l-1)/tot;
  53. }
  54. sort(q+1,q+m+1,cmp);
  55. }
  56. inline void update(int pos,int val){
  57. if(val==1)cnt[c[pos]]++,sum[cnt[c[pos]]]++;
  58. else sum[cnt[c[pos]]]--,cnt[c[pos]]--;
  59. }
  60. void solve(){
  61. for(int i=1,l=0,r=0;i<=m;i++){
  62. while(r>q[i].r)update(r,-1),--r;
  63. while(r<q[i].r)update(r+1,1),++r;
  64. while(l>q[i].l)update(l-1,1),--l;
  65. while(l<q[i].l)update(l,-1),++l;
  66. ans[q[i].id]=sum[q[i].k];
  67. }
  68. for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
  69. }
  70. int main(){
  71. read_and_parse();
  72. solve();
  73. return 0;
  74. }

【CF375D】Tree and Queries的更多相关文章

  1. 【CF375D】Trees and Queries——树上启发式合并

    (题面不是来自Luogu) 题目描述 有一个大小为n且以1为根的树,树上每个点都有对应的颜色ci.现给出m次询问v, k,问以v为根的子树中有多少种颜色至少出现了k次. 输入格式 第一行两个数n,m表 ...

  2. 【POJ3237】Tree 树链剖分+线段树

    [POJ3237]Tree Description You are given a tree with N nodes. The tree's nodes are numbered 1 through ...

  3. 【BZOJ】【2631】Tree

    LCT 又一道名字叫做Tree的题目…… 看到删边加边什么的……又是动态树问题……果断再次搬出LCT. 这题比起上道[3282]tree的难点在于需要像线段树维护区间那样,进行树上路径的权值修改&am ...

  4. 【Luogu1501】Tree(Link-Cut Tree)

    [Luogu1501]Tree(Link-Cut Tree) 题面 洛谷 题解 \(LCT\)版子题 看到了顺手敲一下而已 注意一下,别乘爆了 #include<iostream> #in ...

  5. 【BZOJ3282】Tree (Link-Cut Tree)

    [BZOJ3282]Tree (Link-Cut Tree) 题面 BZOJ权限题呀,良心luogu上有 题解 Link-Cut Tree班子提 最近因为NOIP考炸了 学科也炸了 时间显然没有 以后 ...

  6. 【AtCoder3611】Tree MST(点分治,最小生成树)

    [AtCoder3611]Tree MST(点分治,最小生成树) 题面 AtCoder 洛谷 给定一棵\(n\)个节点的树,现有有一张完全图,两点\(x,y\)之间的边长为\(w[x]+w[y]+di ...

  7. 【HDU5909】Tree Cutting(FWT)

    [HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...

  8. 【CF710F】String Set Queries(二进制分组,AC自动机)

    [CF710F]String Set Queries(二进制分组,AC自动机) 题面 洛谷 CF 翻译: 你有一个字符集合\(D\),初始为空, 有三种操作: 往\(D\)中加入一个串:从\(D\)中 ...

  9. 【BZOJ2654】Tree(凸优化,最小生成树)

    [BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...

随机推荐

  1. "errcode":40163,"errmsg":"code been used...报错,做PC微信登录时出现code been used...报错问题

    这是一个坑,一个巨坑,一个恶心的坑 出现这个问题的大概意思就是微信回调了两次登录接口,code使用了两次,而在微信官方文档上写着code只能用一次,用来获取access_token,但我TM看着就糊涂 ...

  2. ajax获取值的两种方法

    详细连接https://blog.csdn.net/a1102325298/article/details/80785143 ajax获得表单值的俩种方法 2018年06月23日 17:12:02 延 ...

  3. web service 异常

    1.org/apache/commons/discovery/tools/DiscoverSingleton Exception in thread "main" java.lan ...

  4. python 钉钉机器人发送消息

    import json import requests def sendmessage(message): url = 'https://oapi.dingtalk.com/robot/send?ac ...

  5. python django 的环境搭建(centos)

    一.安装好nginx 二.安装uwsgi yum install python-devel -y pip3 install uwsgi #测试启动django /usr/local/python3/b ...

  6. tornado web框架简介

    https://www.cnblogs.com/aylin/p/5702994.html

  7. PLSQL 汉化

    自动导入PLSQL安装目录: 一直下一步就可以了: 之后重新打开:

  8. vue实例相关2

    vue data中 对象/数组 不为空,即使定义为[]/{} new Vue({ el: '#main', data: { list: [], current: {}, aa:'' } }) cons ...

  9. vue 关于生命周期

    序言: 1. vue 单组件的生命周期: 2. vue 父子组件的生命周期: 3. axios 异步请求 与 vue 的组件周期: 一.vue 每个组件的生命周期 关于每个组件的生命周期,官方文档里也 ...

  10. codeforces618B

    Guess the Permutation CodeForces - 618B Bob has a permutation of integers from 1 to n. Denote this p ...