luogu 2509. 森林大礼包

2509. 森林大礼包

★   输入文件:three_squirrels.in   输出文件:three_squirrels.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

有一天紫萱学姐心情不好,学长就买了一个自己最喜欢吃的森林大礼包送给学姐,因为反正最后都是自己吃。

森林大礼包里一共可能有n种包装袋,编号为0~n-1,0号包装袋里有一颗坚果,所有1~n-1号包装袋里都装着若干包其他包装袋,但是不会出现一个包装袋的某个子包装袋里包含这这个包装袋本身的灵异现象。

最终森林大礼包里也会装着若干个包装袋,为了方便表示,我们将森林大礼包视为n号包装袋。请你帮助紫萱学姐计算这个大礼包里一共有多少颗坚果,由于答案可能很大,输出这个数对10^9+7取余的结果。

【输入格式】

输入数据第一行为一个整数n,意义如题目所示。

接下来n行,第i行一个整数ki,代表i号包装袋中含有ki个其他包装袋,接下来ki个整数aij代表这ki个包装袋的编号。

【输出格式】

一个整数,意义如题目所示。

【样例输入】

7
1 0
2 0 1
2 1 2
2 2 3
2 3 4
2 4 5
2 5 6

【样例输出】

21

【提示】

样例中7个包装袋中的坚果数组成了一个斐波那契数列。

对于40%的数据,n≤10。

对于70%的数据,aij<i。

对于100%的数据,n≤100000,0<ki≤10,0≤aij<n且≠i,对于1≤x<y≤ki,aix可能与aiy相等,即一个包装袋内可能装有多个相同编号的包装袋。

【来源】

mzx

这题用邻接表被卡了(555)

返乡topsort 从里向外拓扑,也就是该层为内层之和

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=1e5+20;
const int MOD=1e9+7;
vector<int> G[MAXN];
long long f[MAXN];
int in[MAXN];
queue<int> que;
int n,m;

void topu(int u) {
    que.push(u);
    while(!que.empty()) {
        int q=que.front();
        que.pop();
        for(int i=0; i<G[q].size(); i++) {
            int p=G[q][i];
            in[p]--;
            f[p]+=f[q];
            f[p]%=MOD;
            if(in[p])continue;
            que.push(p);
        }
    }
}

int main() {
    freopen("three_squirrels.in","r",stdin);
    freopen("three_squirrels.out","w",stdout);
    scanf("%d",&n);
    for(int i=1; i<=n; i++) {
        int num;
        scanf("%d",&num);
        for(int j=1; j<=num; j++) {
            int a;
            scanf("%d",&a);
            G[a].push_back(i);
            in[i]++;
        }
    }
    f[0]=1;
    topu(0);
    printf("%lld",f[n]%MOD);
    return 0;
}
时间: 2024-09-30 19:39:56

luogu 2509. 森林大礼包的相关文章

「Luogu P3302」[SDOI2013]森林

给出一片森林,每个点有一个权值,要求支持动态连边,并回答任意两点间第 k 小权值,强制在线.\((1\le N,M,T \le 8\times 10^4)\) Luogu 分析 求第 k 小权值,这个肯定是用主席树了,但连边该怎么办?LCT?可我不会. 我们可以用启发式合并的方法,连边也就是合并两棵树,我们每次将较小的树连到较大的树上去,更新信息就暴力 dfs 较小树中的每一个点就好了. 代码 #include <bits/stdc++.h> #define N 80003 #define D

【Luogu】P1967货车运输(最大生成森林+倍增LCA)

题目链接 倍增LCA是个什么蛇皮原理啊,循环完了还得再往上跳一次才能到最近公共祖先 合着我昨天WA两次就是因为这个 建最大生成森林,因为图不一定是联通的,所以不一定是一棵树.这个地方用克鲁斯卡尔就好了 然后给这个森林跑一遍DFS,顺便倍增 然后对于每个询问跑LCA,倍增的时候已经顺便求出了最小边权,所以往上跳的同时更新答案. 代码如下 #include<cstdio> #include<cctype> #include<cstdlib> #include<cmat

BZOJ3669:[NOI2014]魔法森林——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=3669 https://www.luogu.org/problemnew/show/P2387 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…,m.初始时小 E 同学在 1 号节点,隐士则住在 n 号节点.小 E 需要通过这一片魔法森林,才能够拜访到隐士. 魔

Luogu_P3302 [SDOI2013]森林【题解】主席树 lca 启发式合并

# Luogu_P3302 [SDOI2013]森林 主席树,启发式合并,lca luogu题面 求树上路径的第k大,树之间还有合并. 明显是主席树再加合并. 先说链上第k大,其实就是$Tx+Ty-Tlca-Tlcafa$ $T$表示权值线段树. 主席树维护的是从根节点到当前节点的前缀和. ask的代码如下: inline int ask(int x,int y,int lcc,int lcf,int l,int r,int k){ if(l==r) return b[l]; int lz=su

[SDOI2013]森林(树上主席树)

[SDOI2013]森林(luogu) Description 题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有M条边. 小Z希望执行T个操作,操作有两类: Q x y k查询点x到点y路径上所有的权值中,第k小的权值是多少.此操作保证点x和点y连通,同时这两个节点的路径上至少有k个点. L x y在点x和点y之间连接一条边.保证完成此操作后,仍然是一片森林. 为了体现程序的在线性,我们把输入数据进行了加密.设lastans为程序上一次输出的结果,

luogu P3799 妖梦拼木棒

二次联通门 : luogu P3799 妖梦拼木棒 /* luogu P3799 妖梦拼木棒 用一个桶存下所有的木棒 美剧两根短的木棒长度 后随便乘一乘就 好了.. */ #include <algorithm> #include <cstdio> #define Mod 1000000007 #define Max 5000 void read (int &now) { now = 0; register char word = getchar (); while (wo

[luogu P1967][NOIp2013]P1967 货车运输

题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物. 输入输出格式 输入格式: 输入文件名为 truck.in. 输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道 路. 接下来 m 行每行 3 个整数 x. y. z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z

决策树 随机森林 adaboost

? 熵.互信息? 决策树学习算法 ? 信息增益 ? ID3.C4.5.CART? Bagging与随机森林? 提升 ? Adaboost/GDBT ? 熵.互信息 熵是对平均不确定性的度量. 平均互信息:得知特征Y的信息而使得对标签X的信息的不确定性减少的程度.描述随机变量之间的相似程度.(条件熵.相对熵:差异性) ? 决策树 决策树学习采用的是自顶向下的递归方法,有监督学习. 其基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零,此时每个叶节点中的实例都属于同一类. 建立

[Sdoi2013]森林

/* 平常这种题很常见的思路就是求出dfs序来,然后每次查询的时候就是在主席树上查询 x+y-lca-fa[lca] 的值就行了. 但是这个题要动态的给森林中加边,还是强制在线的,所以就需要考虑换一种方法来维护这个东西. 首先先dfs出每棵树来,然后对于link操作,可以启发式合并两个主席树.这里我们把主席树维护的dfs序变成维护每个点到根的这条路径.所里link的时候假设我们要把x合到y上,那么我们就边dfs x 这棵树,边用当前点的fa作为历史状态的root来更新当前点的root就行了.求l