【题解】ADAGRAFT - Ada and Graft [SP33331]

传送门:\(\text{Ada and Graft}\) \(\text{[SP33331]}\)

【题目描述】

给出一颗 \(n\) 个节点的树(根为 \(0\)),树的价值定义为每个节点的价值乘积。每个节点的值是其子树中不同颜色种类的数量。

给出每个节点上的颜色,求树价值。答案对 \(10^9+7\) 取模。

【输入】

第一行包含一个整数 \(n\)。

第二行包含 \(n-1\) 个整数 \(p_{i}\),分别表示节点 \(i\) 的父亲节点。

第三行包含 \(n\) 个整数 \(F_{i}\),表示节点 \(i\) 的颜色。

【输出】

输出一个整数表示答案模 \(10^9+7\) 的值。

【样例】

样例输入1:
5
0 0 1 1
1 1 1 2 2 样例输出1:
4 样例输入2:
4
0 1 2
6 7 2 3 样例输出2:
24 样例输入3
11
0 1 1 1 3 5 2 7 5 4
494052753 959648710 959648710 959648710 494052753 959648710 959648710 959648710 959648710 494052753 959648710 样例输出3
32

【数据范围】

\(100\%\) \(1 \leqslant N \leqslant 4*10^5,\) \(1 \leqslant F_{i} \leqslant 10^9,\) \(0 \leqslant p_{i} \leqslant i\)


【分析】

求以某个节点为根的子树信息,很明显的线段树合并。

考虑将所有点的权值离散化一下,对每个节点开一颗动态开点权值线段树,按照 \(dfs\) 的遍历顺序不断合并所有子节点,便可得到所有节点的价值,最后乘起来即可。

合并两个权值线段树时可以直接取 \(or\),向上传递信息直接 \(S[p]=S[pl]+S[pr]\)。

注意取模!!!

【Code】

#include<algorithm>
#include<cstdio>
#define LL long long
#define Re register int
using namespace std;
const int N=4e5+3,P=1e9+7;
int n,m,x,y,o,Ans=1,A[N],B[N],pt[N],ans[N],head[N];
struct QAQ{int to,next;}a[N<<1];
inline void add(Re x,Re y){a[++o].to=y,a[o].next=head[x],head[x]=o;}
inline void in(Re &x){
Re fu=0;x=0;char ch=getchar();
while(ch<'0'||ch>'9')fu|=ch=='-',ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=fu?-x:x;
}
struct Segment_Tree{
#define pl tr[p].lp
#define pr tr[p].rp
#define mid (L+R>>1)
int cnt;
struct QAQ{int S,lp,rp;}tr[N*38];//空间要开够
inline void pushup(Re p){tr[p].S=tr[pl].S+tr[pr].S;}
inline void change(Re &p,Re L,Re R,Re w){
if(!p)p=++cnt;
if(L==R){tr[p].S=1;return;}
if(w<=mid)change(pl,L,mid,w);
else change(pr,mid+1,R,w);
pushup(p);
}
inline int merge(Re p,Re q,Re L,Re R){
if(!p)return q;if(!q)return p;
if(L==R){tr[p].S|=tr[q].S;return p;}//合并信息
pl=merge(pl,tr[q].lp,L,mid);
pr=merge(pr,tr[q].rp,mid+1,R);
pushup(p);return p;
}
}T1;
inline void dfs(Re x,Re fa){
for(Re i=head[x],to;i;i=a[i].next)
if((to=a[i].to)!=fa)
dfs(to,x),pt[x]=T1.merge(pt[x],pt[to],1,m);
ans[x]=T1.tr[pt[x]].S;//直接获取整个大区间的答案
}
int main(){
// freopen("123.txt","r",stdin);
in(n);
for(Re i=2;i<=n;++i)in(x),add(++x,i),add(i,x);
for(Re i=1;i<=n;++i)in(A[i]),B[i]=A[i];
sort(B+1,B+n+1),m=unique(B+1,B+n+1)-B-1;
for(Re i=1;i<=n;++i)T1.change(pt[i],1,m,lower_bound(B+1,B+m+1,A[i])-B);//初始化建树
dfs(1,0);
for(Re i=1;i<=n;++i)Ans=(LL)Ans*ans[i]%P;
printf("%d\n",Ans);
}

【题解】ADAGRAFT - Ada and Graft [SP33331]的更多相关文章

  1. SPOJ:Ada and Graft (set合并&优化)

    As you might already know, Ada the Ladybug is a farmer. She grows a big fruit tree (with root in 0). ...

  2. SPOJ ADAFIELD Ada and Field(STL的使用:set,multiset,map的迭代器)题解

    题意:n*m的方格,“0 x”表示x轴在x位置切一刀,“0 y”表示y轴在y位置切一刀,每次操作后输出当前面积最大矩形. 思路:用set分别储存x轴y轴分割的点,用multiset(可重复)储存x轴y ...

  3. Ada and Coins

    Ada and Coins 题意:钱包里有n种钱,然后有m次询问,询问[l,r]区间内能被表示的个数有几个. 题解:这道题是群主推荐我写的,然后让我用bitset去写,他说 操作32个bitset需要 ...

  4. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  5. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  6. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  7. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  8. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  9. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

随机推荐

  1. ReSharper激活方法

    激活方式选择License Keys. 激活码: MTW881U3Z5-eyJsaWNlbnNlSWQiOiJNVFc4ODFVM1o1IiwibGljZW5zZWVOYW1lIjoiTnNzIElt ...

  2. vue-基本动画

    不使用动画 <div id="app"> <input type="button" value="toggle" @cli ...

  3. MySQL学习——数据类型

    MySQL学习——数据类型 摘要:本文主要学习了MySQL数据库的数据类型. 整数类型 MySQL主要提供的整数类型有tinyint.smallint.mediumint.int.bigint,其属性 ...

  4. GALAXY OJ NOIP2019联合测试2-普及组

    概要: 今天比了个赛,还挺水,只不过不太理想. 题目: Problem : 韬韬抢苹果 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果.每个韬韬都想要最大的苹果,所以发 ...

  5. SSM框架之Mybatis(4)SqlMapConfig

    Mybatis(4)SqlMapConfig.xml SqlMapConfig.xml 中配置的内容和顺序 -properties (属性) --property -settings(全局配置参数) ...

  6. Service__cmd安装MySQL并连接SQLyog

    整理记录关于使用cmd安装mysql的过程   1.配置环境变量 1) 计算机->属性->高级系统设置->环境变量 2)先添加变量 变量名:MYSQL_HOME 变量值:D:\mys ...

  7. Linux—网络通讯管理命令

    一.ping命令 . ping 主机名 . ping 域名 [root@localhost ~]# ping www.baidu.com . ping IP地址 [root@localhost ~]# ...

  8. Linux:使用LVM进行磁盘管理

    LVM的概念 LVM 可以实现对磁盘的动态管理,在磁盘不用重新分区的情况下动态调整文件系统的大 小,利用 LVM 管理的文件系统可以跨越磁盘. "/boot"分区用于存放系统引导文 ...

  9. KMP算法计算next值和nextVal值

    KMP算法: 给定一个主串S及一个模式串P,判断模式串是否为主串的子串:若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0: 这里先不写算法,仅仅计算next和nextVal值 那么计算时只 ...

  10. 4. Vue - 指令(Add)

    一.指令系统 1. v-text ​ v-text主要用来更新textContent,可以等同于JS的text属性. <span v-text="msg"></s ...