zay大爷的神仙题目 D1T2-腐草为萤

Posted this-is-m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zay大爷的神仙题目 D1T2-腐草为萤相关的知识,希望对你有一定的参考价值。

题面如下

依照旧例放外链

【题目背景】

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

【问题描述】

扶苏给了你一棵树,这棵树上长满了幼嫩的新叶,我们约定这棵树的根是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个。

技术图片

 

 技术图片

 这个题。。。。。。我一开始以为每一个幼嫩集合只能是两个点,那时候我就想,哎呀这题好,,,,,,结果妥妥爆零

对于这道题,我们一点一点得分哈

第一个点,,,,很明显直接输出0就行。。。。但是因为我在写暴力的时候数组开大了所以程序爆了QWQ。。。。。md我爆零了。。。。

第二阶段,一看这数据范围,那肯定暴力跑不了了,剩下的看图吧QWQ

技术图片

 贴代码

#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];

 

以上是关于zay大爷的神仙题目 D1T2-腐草为萤的主要内容,如果未能解决你的问题,请参考以下文章

模拟赛T2腐草为萤

TcaplusDB | 大暑至,万物荣华

[JZOJ1901] 2010集训队出题光棱坦克

BJOI2018

校内题目锦鲤抄

几道经典动态内存分配笔试题!楼下大爷做完直呼就这?(题目+答案+详解)C语言