【UOJ 579】树上的颜色

【题目描述】:

给出一棵有N个点的有根树,结点编号为1,2,3,……,N,根结点编号为1,编号为i的结点涂上颜色Ci。现在有M个询问,每个询问要求求出以结点u为根的子树上涂有此种颜色的结点个数不小于k的颜色个数有多少。

【输入描述】:

第一行包含两个正整数N和M。

第二行包含N个正整数,C1,C2,…,CN。

接下来的N-1行每行有两个正整数x和y,表示结点x和y有边相连。

再接下来的M行每行有两个正整数u和k,表示一个询问。

【输出描述】:

输出M行,每行一个非负整数,对应每个询问的答案。

【样例输入1】:

4 1
1 2 3 4
1 2
2 3
3 4
1 1

【样例输出1】:

4

【样例输入2】:

8 5
1 2 2 3 3 2 3 3
1 2
1 5
2 3
2 4
5 6
5 7
5 8
1 2
1 3
1 4
2 3
5 3

【样例输出2】:

2
2
1
0
1

【时间限制、数据范围及描述】:

时间:1s 空间:256M

对于10%的数据,N≤100,M≤100,Ci≤100;

对于30%的数据,N≤500,M≤100;

对于60%的数据,N≤2000,M≤100000;

对于100%的数据,N≤100000,M≤100000,Ci≤100000。

题解:为啥我暴力分都拿不到……百思不得其解,如果有dalao看出错误,就留个言吧,谢谢您了

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int N=100002;
int n,ques,x,y;
struct node{
    int u,v,next;
}a[N];
int h[N],cnt,ans;
int c[N];
int z,fj[N],biu[N];

void add(int u,int v){
    a[++cnt].u=u; a[cnt].v=v;
    a[cnt].next=h[u]; h[u]=cnt;
}

void init(){
    scanf("%d %d",&n,&ques);
    for(int i=1;i<=n;i++)
        scanf("%d",&c[i]);
    for(int i=1;i<n;i++){
        scanf("%d %d",&x,&y);
        add(x,y);
    }
}

void dfs(int x){
    for(int i=h[x];i;i=a[i].next)
        { int v=a[i].v; fj[c[v]]++; dfs(v); }
}

void work(){
    while(ques--){
        scanf("%d %d",&x,&y);
        int ans=0;
        memset(fj,0,sizeof(fj));
        memset(biu,0,sizeof(biu));
        fj[c[x]]++; dfs(x);
        for(int i=1;i<=n;i++){
            if(fj[c[i]]>=y && biu[c[i]]==0)
               { ans++; biu[c[i]]=1; }
        }
        printf("%d\n",ans);
    }

}
int main(){
    freopen("579.in","r",stdin);
    freopen("579.out","w",stdout);
    init(); work();
    return 0;
}

原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11518014.html

时间: 2024-08-05 03:32:26

【UOJ 579】树上的颜色的相关文章

1760:树上数颜色

时间限制: 3000 ms 内存限制: 524288 KB提交数: 35 通过数: 9 [题目描述]送你一棵n个点的树,树根为1.一开始每个点上有一个1∼n 的颜色ci,不同点颜色可以相同. 现在有 q 次操作, 分为两种类型: 1 u l r:询问子树 u 中有多少种在 l 到 r 之间的颜色至少出现了一次: 2 u c:将 u 的颜色修改为 c. 部分测试点要求强制在线. [输入]第一行三个整数n,q,t,分别表示树的点数,操作的个数和是否强制在线. t=0表示不强制在线,t=1表示强制在线

【UOJ】树上gcd

点分治 这道题还有很多种其它写法,什么长链剖分啦,启发式合并啦等等. 首先,我们可以把点对\((u,v)\)分成两类: 1.u到v的路径是一条链 2.u到v的路径不是一条链(废话) 对于第一类,显然\(f(u,v)\)就是链的长度,可以单独统计 对于第二类,就要在点分治上搞了 我们可以先计算出为d的倍数的点对数,最后容斥一下即可 在点分治中,我们取出当前子树的重心root,统计路径经过root的点对,那么又可以分成两类: A.u和v都在root的子树内 B.u和v一个在root的子树内,另一个不

师大校赛D coloring Game 并查集

这题说的是 在一个 森林中 两个人在这棵树上涂颜色,黑色或者白色,第一次只能在1 号节点上涂色 第二次 只能在2上涂,以此类推, 在每个节点上只能涂黑色或者白色,并且相邻的点不能有相同的颜色,最后求不能填的人就输了. 每个点周围的比他小的点 都会有一个祖先(或者是他们自己),我们知道他周围的点的祖先中最小的那个点 一定是影响他的最小的点 那么他取什么值这就不那么重要了.无论他取黑还是白,后面的就只是相对而言,那么如果他受到第二小或者以上的点的影响,那么他就一定不能了, 还有就是当他和他周围点离他

Hdu 5029 Relief grain(熟练剖分)

题目大意: 给出一棵树. 然后有m个操作,每个操作都在两点的路径上分配不同的粮食. 最后要求输出所有村庄有的最多的粮食的种类. 思路分析: 一眼就看得出来是树链剖分的题目. 现在的问题就是,每一次操作,如何维护每个点的最多的食物编号,以及最多的食物的数量.要记录这两个值是肯定的. 首先可以想到将所有的操作按照z排序.这样每一回合操作,称一回合为处理同一种颜色.一回合结束之后,后面的操作就不会影响前面取得的最大值.因为后面的操作的食物的种类不一样,是不可以再继续累加的. 然后可以发现一个规律,就是

大一课设 消灭星星

1 #include<iostream> 2 #include<graphics.h> 3 #include<windows.h> 4 #include<cstring> 5 #include<cmath> 6 #include<cstring> 7 #include<cstdlib> 8 #include<cstdio> 9 #include<time.h> 10 #include <pth

[Luogu P5680][GZOI2017]共享单车

题目链接 之前没看懂题意就把这题扔了,现在一看是读错题意了 简化版题意 给出一颗树(这个图的最短路径生成树),每个点初始颜色为\(0\) 两种操作: 将部分点颜色取反 给出一些点,建出虚树(边权为两点树上距离),求最小割边代价使得虚树上没有颜色为\(1\)的点与根联通 那这就很模板了: 设\(f[x]\)表示\(x\)子树的答案,\(c[x]\)表示\(x\)的颜色,则有转移方程:(当\(f[K]=0\)时输出\(-1\)) \[ f[x]+=Val(x,y)\quad (c[y]=1)\f[x

SPOJ 16549 - QTREE6 - Query on a tree VI 「一种维护树上颜色连通块的操作」

题意 有操作 $0$ $u$:询问有多少个节点 $v$ 满足路径 $u$ 到 $v$ 上所有节点(包括)都拥有相同的颜色$1$ $u$:翻转 $u$ 的颜色 题解 直接用一个 $LCT$ 去暴力删边连边显然会 $T$ 那么只有两个颜色的话就可以建两棵 $LCT$ ,观察到每次单点修改颜色时其子树所包含连通块在原颜色树上与其父亲所代表连通块断开,所以可以看作断开与父节点的边(实际上是点化边的思想),那么其它常规操作即可 注意要建个虚拟节点作为根节点的父亲 注意 $0$ 操作询问的输出,详细解释有在

[UOJ]#33. 【UR #2】树上GCD

题目大意:给定一棵有根树,边长均为1,对于每一个i,求树上有多少个点对,他们到lca距离的gcd是i.(n<=200,000) 做法:先容斥,求出gcd是i的倍数的点对,考虑长链剖分后从小到大合并计算答案,小的部分先把每个深度的数量变为每个深度的倍数的数量,然后若深度>k,直接到大的里面暴力,若深度<=k,我们在大的里面维护f[i][j]表示深度mod i(1<=i<=k)为j的点数,理论上k取n^0.5时达到最小复杂度O(n^1.5),实际上k比较小的时候常数较小.另外递归

[UOJ #58][WC2013]糖果公园(树上带修改莫队)

Description Solution 树上带修改莫队…!VFK的题解写得很清楚啦 (我的程序为什么跑得这么慢…交的时候总有一种自己在卡测评的感觉…) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 100005 typedef long l