模拟赛T2腐草为萤

2.腐草为萤
(dzy.cpp/c)

【题目背景】

纤弱的淤泥中妖冶
颓废在季夏第三月
最幼嫩的新叶连凋零都不屑
何必生离死别
——银临《腐草为萤》

【问题描述】

扶苏给了你一棵树,这棵树上长满了幼嫩的新叶,我们约定这棵树的根是1,每个节
点都代表树上的一个叶子。
如果你不知道什么叫树,你可以认为树是一个边数比节点个数少1 的无向连通图。
我们如果约定节点u 是树T 的根,则可以定义一个节点v 到根的路径为该无向图上u, v
两个节点之间的简单路径上的节点集合(包括路径的两个端点)。可以证明,这样的简单路
径只有一条。
我们定义节点x 是节点y 的祖先(x ≠ y),当且仅当x 在y 到根的路径上。

现在扶苏想在这棵树上选定一个集合,将其称之为幼嫩集合,来比较集合中的节点
哪个最幼嫩。注意到一旦集合中存在两个节点u, v,使得u 是v 的祖先,那么一定v 要比
u 更幼嫩,因为v 是在u 的枝丫上生长出来的,那么这样的集合就是没有意义的。也就是
说,扶苏所选择的集合一定满足要求“对于任意集合中的元素对(u, v),u 不是v 的祖先”。

扶苏其实对这些节点哪个最幼嫩并不感兴趣,也对他能选出多少集合不感兴趣,因
为这些都是为了问你下面的问题而创造出的题目背景。
扶苏给每个节点都定义了一个权值,具体的,我们会给出一个参数T,规定 i 号节点
的权值为 iT
我们定义一个幼嫩集合幼嫩指数为集合内节点的权值和。现在扶苏想请问你,对于
他所有可能选出的集合,这些集合的幼嫩指数之和是多少。
为了避免答案过大,请你输出答案对 109 + 7取模的结果。

【输入格式】
输入文件名为dzy.in。
输入文件中有且仅有一组数据,第一行为两个正整数n 和T,节点个数和权值参数。
下面n-1 行,每行有两个正整数u, v,代表树上有一条边连接节点u 和节点v。

【输出格式】
输出文件名为dzy.out。
输出一行一个正整数,代表答案对 109 +7取模的结果。

【样例1 解释】
一共有10 个集合,分别为
 {1}  ,  {2}  ,  {3}  ,  {4}  ,  {5}  ,  {2,5}  ,  {3,4}  ,   {3,5}  ,  {3,4,5}  ,  {4,5}
由于T=0,所有节点的权值都为1,所以幼嫩指数之和即为集合元素个数和,
共16个。

2.腐草为萤
(dzy.cpp/c)

【题目背景】

纤弱的淤泥中妖冶
颓废在季夏第三月
最幼嫩的新叶连凋零都不屑
何必生离死别
——银临《腐草为萤》

【问题描述】

扶苏给了你一棵树,这棵树上长满了幼嫩的新叶,我们约定这棵树的根是1,每个节
点都代表树上的一个叶子。
如果你不知道什么叫树,你可以认为树是一个边数比节点个数少1 的无向连通图。
我们如果约定节点u 是树T 的根,则可以定义一个节点v 到根的路径为该无向图上u, v
两个节点之间的简单路径上的节点集合(包括路径的两个端点)。可以证明,这样的简单路
径只有一条。
我们定义节点x 是节点y 的祖先(x ≠ y),当且仅当x 在y 到根的路径上。

现在扶苏想在这棵树上选定一个集合,将其称之为幼嫩集合,来比较集合中的节点
哪个最幼嫩。注意到一旦集合中存在两个节点u, v,使得u 是v 的祖先,那么一定v 要比
u 更幼嫩,因为v 是在u 的枝丫上生长出来的,那么这样的集合就是没有意义的。也就是
说,扶苏所选择的集合一定满足要求“对于任意集合中的元素对(u, v),u 不是v 的祖先”。

扶苏其实对这些节点哪个最幼嫩并不感兴趣,也对他能选出多少集合不感兴趣,因
为这些都是为了问你下面的问题而创造出的题目背景。
扶苏给每个节点都定义了一个权值,具体的,我们会给出一个参数T,规定 i 号节点
的权值为 iT
我们定义一个幼嫩集合幼嫩指数为集合内节点的权值和。现在扶苏想请问你,对于
他所有可能选出的集合,这些集合的幼嫩指数之和是多少。
为了避免答案过大,请你输出答案对 109 + 7取模的结果。

【输入格式】
输入文件名为dzy.in。
输入文件中有且仅有一组数据,第一行为两个正整数n 和T,节点个数和权值参数。
下面n-1 行,每行有两个正整数u, v,代表树上有一条边连接节点u 和节点v。

【输出格式】
输出文件名为dzy.out。
输出一行一个正整数,代表答案对 109 +7取模的结果。

【样例1 解释】
一共有10 个集合,分别为
 {1}  ,  {2}  ,  {3}  ,  {4}  ,  {5}  ,  {2,5}  ,  {3,4}  ,   {3,5}  ,  {3,4,5}  ,  {4,5}
由于T=0,所有节点的权值都为1,所以幼嫩指数之和即为集合元素个数和,
共16个。

2.腐草为萤
(dzy.cpp/c)

【题目背景】

纤弱的淤泥中妖冶
颓废在季夏第三月
最幼嫩的新叶连凋零都不屑
何必生离死别
——银临《腐草为萤》

【问题描述】

扶苏给了你一棵树,这棵树上长满了幼嫩的新叶,我们约定这棵树的根是1,每个节
点都代表树上的一个叶子。
如果你不知道什么叫树,你可以认为树是一个边数比节点个数少1 的无向连通图。
我们如果约定节点u 是树T 的根,则可以定义一个节点v 到根的路径为该无向图上u, v
两个节点之间的简单路径上的节点集合(包括路径的两个端点)。可以证明,这样的简单路
径只有一条。
我们定义节点x 是节点y 的祖先(x ≠ y),当且仅当x 在y 到根的路径上。

现在扶苏想在这棵树上选定一个集合,将其称之为幼嫩集合,来比较集合中的节点
哪个最幼嫩。注意到一旦集合中存在两个节点u, v,使得u 是v 的祖先,那么一定v 要比
u 更幼嫩,因为v 是在u 的枝丫上生长出来的,那么这样的集合就是没有意义的。也就是
说,扶苏所选择的集合一定满足要求“对于任意集合中的元素对(u, v),u 不是v 的祖先”。

扶苏其实对这些节点哪个最幼嫩并不感兴趣,也对他能选出多少集合不感兴趣,因
为这些都是为了问你下面的问题而创造出的题目背景。
扶苏给每个节点都定义了一个权值,具体的,我们会给出一个参数T,规定 i 号节点
的权值为 iT
我们定义一个幼嫩集合幼嫩指数为集合内节点的权值和。现在扶苏想请问你,对于
他所有可能选出的集合,这些集合的幼嫩指数之和是多少。
为了避免答案过大,请你输出答案对 109 + 7取模的结果。

【输入格式】
输入文件名为dzy.in。
输入文件中有且仅有一组数据,第一行为两个正整数n 和T,节点个数和权值参数。
下面n-1 行,每行有两个正整数u, v,代表树上有一条边连接节点u 和节点v。

【输出格式】
输出文件名为dzy.out。
输出一行一个正整数,代表答案对 109 +7取模的结果。

【样例1 解释】
一共有10 个集合,分别为
 {1}  ,  {2}  ,  {3}  ,  {4}  ,  {5}  ,  {2,5}  ,  {3,4}  ,   {3,5}  ,  {3,4,5}  ,  {4,5}
由于T=0,所有节点的权值都为1,所以幼嫩指数之和即为集合元素个数和,
共16个。

#include <cstdio>

typedef long long int ll;

const int maxn = 1000005;
const int MOD = 1000000007;

template <typename T>
inline void qr(T &x) {
  char ch;
  do { ch = getchar(); } while ((ch > ‘9‘) || (ch < ‘0‘));
  do { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); } while ((ch >= ‘0‘) && (ch <= ‘9‘));
}

int n, T;
int MU[maxn], frog[maxn], gorf[maxn];
bool vis[maxn];

struct Edge {
  int v;
  Edge *nxt;

  Edge(const int _v, Edge *h) : v(_v), nxt(h) {}
};
Edge *hd[maxn];

void dfs(const int u);

int main() {
  freopen("dzy.in", "r", stdin);
  freopen("dzy.out", "w", stdout);
  qr(n); qr(T);
  if (T) {
    for (int i = 1; i <= n; ++i) {
      MU[i] = i;
    }
  } else {
    for (int i = 1; i <= n; ++i) {
      MU[i] = 1;
    }
  }
  for (int i = 1, u, v; i < n; ++i) {
    u = v = 0; qr(u); qr(v);
    hd[u] = new Edge(v, hd[u]);
    hd[v] = new Edge(u, hd[v]);
  }
  dfs(1);
  printf("%d\n", frog[1] % MOD);
  return 0;
}

void dfs(const int u) {
  vis[u] = true;
  for (auto e = hd[u]; e; e = e->nxt) if (!vis[e->v]) {
    int v = e->v;
    dfs(v);
    frog[u] = (frog[u] * (gorf[v] + 1ll) % MOD) + (frog[v] * (gorf[u] + 1ll) % MOD);
    gorf[u] = (gorf[u] + gorf[v] + (1ll * gorf[u] * gorf[v])) % MOD;
  }
  frog[u] = (frog[u] + MU[u]) % MOD;
  ++gorf[u];
}

原文地址:https://www.cnblogs.com/lcezych/p/11072476.html

时间: 2024-10-16 00:34:53

模拟赛T2腐草为萤的相关文章

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

20180530模拟赛T2——绀碧之棺

题目背景Background qiancl 得到了一张藏宝图,上面写了一道谜题. 题目描述 Description 定义\(F(n)\)为 n 在十进制下各个数位的平方和,求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n) = n\). 输入描述 (coffin.in) Input Description 一行三个正整数\(k,a,b\). 输出描述 (coffin.out) Output Description 一行一个整数表示满足条件的\(n\)的个数. 样例输入Sa

[10.4模拟赛]T2

T2 Description 现有一个\(n\)个点,\(m\)条无向边的图.要求求出从编号为\(1\)的点到编号为\(n\)的点经过的边的边权的绝对值之和最小的路径.特别的,每经过一条边,图上所有边的边权就会改变,若原边权为x,新的边权是\(\frac{1}{1-x}\). 答案保留3位小数 Input 第一行两个整数\(m\),\(n\),表示点数和边数. 接下来\(m\)行,每行三个整数\(u\),\(v\),\(x\),表示有一条连接\(u\),\(v\),边权位\(x\). Outpu

字符串模拟赛T2

// source code from laekov for c0x17 #define PRID "fkqh" #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 200009; int n, l[maxn], q[maxn], vx[maxn], vy[maxn]; char a[maxn]; void ma

20161022 NOIP模拟赛 T2 解题报告

旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起点的距离为ai千米(ai为非负整数).不存在两个目的地和起点的距离相同. 从第i个目的地走到第j个目的地所走的路程为 |ai-aj|千米.我们把参观n个目的地的顺序称作一次“旅行”.lahub可以参观他想要参观的任意顺序,但是每个目的地有且只能被参观一次(参观顺序为n的排列). lahub把所有可能

11.12 模拟赛T2 冒泡排序图

[问题描述] 有一段使用冒泡排序产生一张图的伪代码如下:function bubbleSortGraph(n, a[]): graph = emptyGraph() repeat swapped = false for i = 1 to n - 1:  if a[i] > a[i + 1]: graph.addEdge(a[i], a[i + 1]) swap(a[i], a[i + 1]) swapped = true until not swapped return graph函数的输入为长

洛谷 U361 序列操作(NOIP模拟赛T2)

题目链接:https://www.luogu.org/problem/show?pid=U361 题目背景 夏令营 题目描述 小B有一个整数序列a[1..N],初始时序列中所有元素均为0.他会在序列上进行下面两种操作,操作共M个: A l r x:将a[l..r]均加上x. Q l r:询问a[l..r]中的最大值. 输入输出格式 输入格式: 第一行,两个整数N, M. 接下来的M行,每行一个操作. 输出格式: 设询问操作有T个,则输出T行,每行一个整数,表示询问操作对应的答案. 输入输出样例

2017/9/3模拟赛T2

题解:由于题目已经提示我们这是个单峰函数,所以很容易想到三分法,所以我们就枚举中位数,为保证平均数最大,左右两侧都从右往左取数. 代码如下: 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #define MN 100005 5 using namespace std; 6 int n,a[MN],maxl,l,r,lm,rm; 7 long long sum[MN]; 8 double a

2017 9 27 模拟赛 T2

原题题意:给出一个集合S,现满足以下关系: 实际题意:求32的n次方(这...)