链接:https://ac.nowcoder.com/acm/contest/904/E

来源:牛客网

DongDong数颜色

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 524288K,其他语言1048576K

64bit IO Format: %lld

题目描述

DongDong是个喜欢数颜色的女孩子,她已经熟练地掌握了在序列上数颜色的操作,现在她开始学习如何在树上数颜色,现在给定一个n个点,n-1条边的树形图(视1号店为根),每个点有一个颜色,每次询问以x为根的子树中有多少种不同的颜色,DongDong轻松地解决了这个问题,但她想考考会编程的你。

输入描述:

第一行两个整数n,m

第二行n个整数,表示每个点的颜色

接下来n-1行每行u,v,表示存在一条从u到v的双向边(保证最终图形是树形图)

2<=n<=100000,1<=m,color<=n,

输出描述:

共m行:每行输出相应询问的答案

示例1

输入

复制

4 3

1 1 2 3

1 2

2 3

1 4

1

2

4

输出

复制

3

2

1

思路:

我们知道一个节点的为根的子树节点在树的dfs序中是一个连续的区间,且区间的长度就是子树大小,那么我们可以一次dfs维护出

1、 以i节点为根的子树大小

2、 dfs序中第i个是哪个节点。

3、 第i个节点在dfs序中的位置。

然后我们可以把问题转化为常见的区间询问的问题,我们可以用莫队算法离线做。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
ll ans[maxn];
ll Ans=0ll;
int l=0;
int r=0;
struct node
{
int l,r,id;
}a[maxn];
int pos[maxn];
int n,m;
int len;
bool cmp(node aa,node bb)
{
if(pos[aa.l]==pos[bb.l])
{
return aa.r<bb.r;
}else
{
return pos[aa.l]<pos[bb.l];
}
}
int col[maxn];
int flag[maxn];
int wid[maxn];
void add(int x)
{
if(!flag[col[wid[x]]])
{
Ans++;
}
flag[col[wid[x]]]++;
}
void del(int x)
{
if(1==flag[col[wid[x]]])
{
Ans--;
}
flag[col[wid[x]]]--;
}
std::vector<int> son[maxn];
int S[maxn];
int tot=1;
int info[maxn];
void dfs(int x,int pre)
{
S[x]=1ll;
info[x]=tot;
wid[tot++]=x; // 保存dfs序的第i个位置是哪个节点。
for(auto y:son[x])
{
if(y!=pre)
{
dfs(y,x);
S[x]+=S[y];
}
}
}
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
gg(n);gg(m);
len=(int)(sqrt(n));
repd(i,1,n)
{
gg(col[i]);
}
int u,v;
repd(i,1,n-1)
{
gg(u);
gg(v);
son[v].pb(u);
son[u].push_back(v);
}
dfs(1,-1);
repd(i,1,m)
{
gg(a[i].l);
int temp=S[a[i].l];// 以a[i].l 为根的子树大小。
a[i].l=info[a[i].l]; // a[i].l 在dfs序中的位置。
a[i].r=a[i].l+temp-1; // 询问区间 右端点 在dfs序中的位置。
a[i].id=i;
pos[i]=i/len; // 莫队分块的部分。
}
sort(a+1,a+1+m,cmp);
repd(i,1,m)
{
while(l>a[i].l)
{
l--;
add(l);
}
while(r<a[i].r)
{
r++;
add(r);
}
while(l<a[i].l)
{
del(l);
l++;
}
while(r>a[i].r)
{
del(r);
r--;
}
ans[a[i].id]=Ans;
}
repd(i,1,m)
{
printf("%lld\n",ans[i]);
}
return 0;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

牛客练习赛47 DongDong数颜色 (莫队算法)的更多相关文章

  1. [BZOJ2120]数颜色(莫队算法)

    Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...

  2. 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  3. 牛客练习赛47 E DongDong数颜色 (树上启发式合并)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  4. 牛客练习赛47 D DongDong坐飞机 (分层最短路)

    链接:https://ac.nowcoder.com/acm/contest/904/D 来源:牛客网 DongDong坐飞机 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  5. 牛客练习赛47 A DongDong破密码 (异或性质,递推)

    链接:https://ac.nowcoder.com/acm/contest/904/A 来源:牛客网 DongDong破密码 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1310 ...

  6. bzoj2120 数颜色 莫队 带修改

    [bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...

  7. bzoj2120: 数颜色 [莫队][分块]

    Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...

  8. BZOJ2120 数颜色 莫队 带修莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...

  9. 牛客练习赛31A 地、颜色、魔法(搜索+二维数组一维表示)

    红色来源于山脉,象征着狂躁.愤怒.混乱,血雨腥风,电光火石. 蓝色来源于海岛,象征着控制.幻觉.诡计,运筹帷幄,谋定后动. 绿色来源于树林,象征着生命.蛮力.成长,横冲直撞,生生不息. 黑色来源于沼泽 ...

随机推荐

  1. 【转】Java从hdfs上读取文件中的某一行

    [From]https://blog.csdn.net/u010989078/article/details/51790166 package test; import java.io.Buffere ...

  2. js中的堆内存和栈内存

    我们常常会听说什么栈内存.堆内存,那么他们到底有什么区别呢,在js中又是如何区分他们的呢,今天我们来看一下. 一.栈内存和堆内存的区分 一般来说,栈内存主要用于存储各种基本类型的变量,包括Boolea ...

  3. 05 vue-cli如何运行

    一.index.html index.html跟其他html一样,只有一个空的根节点,提供main.js用来挂载实例,所有内容通过vue来填充. 二.main.js main.js主要是引入vue框架 ...

  4. 【HANA系列】SAP HANA SQL计算某日期是当年的第几天

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL计算某日 ...

  5. LINQ查询表达式详解(2)——查询表达式的转换

    简介 C#在执行LINQ查询表达式的时候,并不会指定其执行语义,而是将查询表达式转换为遵循查询表达式模式的方法的调用.具体而言,查询表达式将转换为以下名称的调用:Where.Select.Select ...

  6. 使用PowerShell 自动创建DFS命名空间服务器

    运行环境:Windows Server 2012 R2 DFS命名空间概述 DFS命名空间 PowerShell脚本命令 Writing PowerShell DFS Scripts: Managin ...

  7. 题目---汉诺塔及AI代码及八皇后

    2019春第十一周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering ...

  8. [转帖]爬过这 6 个坡,你就能对 Linux 操作系统了如指掌

    爬过这 6 个坡,你就能对 Linux 操作系统了如指掌 http://www.51testing.com/html/16/n-4461316.html 学习的任务 任重道远 我现在处于第一阶段. 发 ...

  9. ETL初探

    初识ETL 概念 ETL即Extract-Transform-Load.目的是将分散.凌乱.异质的数据整合在一起,为决策提供分析数据,是BI项目(Business Intellifence)项目中重要 ...

  10. 02:linux常用命令

    1.1 linux查看系统基本参数常用命令 1.查看磁盘 [root@linux-node1 ~]# df -hl Filesystem Size Used Avail Use% Mounted on ...