首页 > 其他分享 >[JSOI2018] 潜入行动

[JSOI2018] 潜入行动

时间:2023-08-26 17:13:18浏览次数:63  
标签:JSOI2018 行动 节点 int 潜入 外星人 JYY 监听 设备

题目描述

外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻。

在黄金舰队就位之前,JYY 打算事先了解外星人的进攻计划。现在,携带了监听设备的特工已经秘密潜入了外星人的母舰,准备对外星人的通信实施监听。

外星人的母舰可以看成是一棵 \(n\) 个节点、 \(n-1\) 条边的无向树,树上的节点用 \(1,2,\cdots,n\) 编号。JYY 的特工已经装备了隐形模块,可以在外星人母舰中不受限制地活动,可以神不知鬼不觉地在节点上安装监听设备。

如果在节点 \(u\) 上安装监听设备,则 JYY 能够监听与 \(u\) 直接相邻所有的节点的通信。换言之,如果在节点 \(u\) 安装监听设备,则对于树中每一条边 \((u,v)\) ,节点 \(v\) 都会被监听。特别注意放置在节点 \(u\) 的监听设备并不监听 \(u\) 本身的通信,这是 JYY 特别为了防止外星人察觉部署的战术。

JYY 的特工一共携带了 \(k\) 个监听设备,现在 JYY 想知道,有多少种不同的放置监听设备的方法,能够使得母舰上所有节点的通信都被监听?为了避免浪费,每个节点至多只能安装一个监听设备,且监听设备必须被用完

code

#include <bits/stdc++.h>
using namespace std;

inline int read()
{
    int x = 0; char c = getchar();
    while (! isdigit(c)) c = getchar();
    while (isdigit(c)) 
        x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
    return x;
}

const int mod = 1e9 + 7;
const int Maxn = 1e5 + 7;

vector<int> g[Maxn];
int n, k, dp[Maxn][101][4], tmp[101][4];
int siz[Maxn];

/* 
 * 令f[i][j][0~3]为以i为根节点的子树内,放了j个设备;
 * 0表示为本身没放,当前节点没有覆盖;
 * 1表示为本身放,当前节点没有覆盖;
 * 2表示为本身没放,当前节点有覆盖;
 * 3表示为本身放,当前节点有覆盖的方案数。
 * 
 * f[u][i + j][0] = f[u][i][0] * f[v][j][2]
 * f[u][i + j][1] = f[u][i][1] * (f[v][j][0] + f[v][j][2])
 * f[u][i + j][2] = f[u][i][2] * (f[v][j][2] + f[v][j][3]) + f[u][i][0] * f[v][j][3]
 * f[u][i + j][3] = f[u][i][1] * (f[v][j][1] + f[v][j][3]) + f[u][i][3] * f[v][j][0~3]
 */

void dfs(int u, int fa)
{
    siz[u] = 1;
    dp[u][0][0] = dp[u][1][1] = 1;  
    for (int v : g[u]) if (v != fa)
    {
        dfs(v, u);
        for (int i = 0; i <= k; i ++ ) 
            for (int j = 0; j <= 3; j ++ )
                tmp[i][j] = 0;
        
        for (int i = 0; i <= min(siz[u], k); i ++ ) 
            for (int j = 0; j <= min(siz[v], k - i); j ++ ) 
            {
                tmp[i + j][0] = (1ll * dp[u][i][0] * dp[v][j][2] %mod + tmp[i + j][0]) %mod;

                tmp[i + j][1] = (1ll * dp[u][i][1] * (1ll * dp[v][j][0] + 1ll * dp[v][j][2]) %mod + tmp[i + j][1]) %mod;

                tmp[i + j][2] = (1ll * dp[u][i][2] * (1ll * dp[v][j][2] + 1ll * dp[v][j][3]) %mod + tmp[i + j][2]) %mod;
                tmp[i + j][2] = (1ll * dp[u][i][0] * dp[v][j][3] %mod + tmp[i + j][2]) %mod;

                tmp[i + j][3] = (1ll * dp[u][i][3] * (1ll * dp[v][j][0] + 1ll * dp[v][j][1] + 1ll * dp[v][j][2] + dp[v][j][3]) %mod + tmp[i + j][3]) %mod;
                tmp[i + j][3] = (1ll * dp[u][i][1] * (1ll * dp[v][j][1] + dp[v][j][3]) %mod + tmp[i + j][3]) %mod;
            }
        siz[u] += siz[v];

        for (int i = 0; i <= k; i ++ )
            for (int j = 0; j <= 3; j ++ ) 
                dp[u][i][j] = tmp[i][j];
    }
}

int main()
{
    n = read(); k = read();
    for (int i = 1, u, v; i < n; i ++ ) 
    {   
        u = read(), v = read();
        g[u].push_back(v); g[v].push_back(u);
    }
    dfs(1, 0);
    printf("%lld", (dp[1][k][2] + dp[1][k][3]) %mod);
    return 0;
}

标签:JSOI2018,行动,节点,int,潜入,外星人,JYY,监听,设备
From: https://www.cnblogs.com/Cnghit/p/17659106.html

相关文章

  • mongo判断某些字段上有没有索引,进行动态创建
    IndexOptions:privatebooleanbackground;privatebooleanunique;privateStringname;privatebooleansparse;privateLongexpireAfterSeconds;privateIntegerversion;privateBsonweights;privateStringdefaultLanguage;......
  • 3、oracle迁移到postgres-执行动态sql传参不同
    目录oracle迁移到postgres-执行动态sql传参不同1、oracle使用的是:12、postgres使用的是$1oracle迁移到postgres-执行动态sql传参不同在sql字符串中,会动态传入值,使用阿拉伯数据定义传参的个数。1、oracle使用的是:1executeimmediate'select*fromsys_stuwherestu_name=......
  • 如何优雅的对input框数据进行动态脱敏
    说在前面......
  • 虹科方案|有数据而用之无方,不如无数据!用虹科Domo,对数据采取行动!
    随着数据量的持续增长,利用数据支撑行动变得越发重要。然而,许多企业即使收集到了数百万条数据,也未能利用数据推动业务价值增长。为了支持业务团队采用可操作的分析,Domo列出了商业团队可以对数据采取行动的十大方法,以改进流程提高生产力和效率,提升业务绩效等等。支持可操作数据的方法......
  • C语言中如何进行动态内存分配和释放
    动态内存分配和释放是C语言中非常重要的概念,它允许在程序运行时动态地申请和释放内存空间,提高程序的灵活性和效率。本文将围绕这一主题,详细介绍C语言中如何进行动态内存分配和释放。在C语言中,动态内存分配和释放主要通过malloc()和free()函数实现。malloc()函数用于申请一块指定......
  • 备份小能手,还原大行动!NAS整机备份同步指南
    现在的我们越来越离不开电子设备,但当我们使用一段时间之后就可能会出现各种各样的问题影响我们的数据安全,备份数据就显得尤为重要。今天和大家分享铁威马整机备份的工具:傲梅备份。傲梅备份搭配铁威马NAS,轻松实现备份系统、文件、磁盘、分区,一旦电脑发生异常时,我们可以轻易地还原......
  • 护网行动 | AD360 在网络安全中的重要作用
    随着数字化时代的来临,网络已经成为了人们生活和工作中不可或缺的一部分。然而,随之而来的是网络安全问题日益突出。为了应对这些安全威胁,护网行动应运而生,其中AD360在保障网络安全方面扮演着至关重要的角色。AD360是一个集成的解决方案,能够帮助企业高效地管理和保护其IT基础设施,提供......
  • 某行动态cookie反爬虫分析
    某行动态cookie反爬虫分析1.预览反爬网址(base64):aHR0cDovL3d3dy5wYmMuZ292LmNu反爬截图:需要先加载运行js代码,可能是对环境进行检测,反调试之类的无限debugger处理办法网上大部分人说的都是添加cookie来解决。那个noscript标签仅仅是用于提示用户的,在......
  • 18行动态表格生成
    <xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"        xmlns:fo="http://www.w3.org/1999/XSL/Format">  <!--定义传入的参数--> <xsl:paramname="listSize"/>  ......
  • 高等数学暑假打卡行动 --【Day 1】-- 初等函数回顾+极限概念
    今日重点基本初等函数和初等函数区别基本初等函数包括:幂函数\(y=x^a\)、指数函数\(y=a^x\)、对数函数\(y=log_ax\)、三角函数\(y=sinx,y=cosx,y=secx,y=cscx\)和反三角函数\(y=arcsinx,y=arccosx,y=arctanx,y=arccotx\),多项式函数\(a_nx^n+a_{n-1}x^{n+1}+...+a_1x+......