首页 > 其他分享 >广州2022CCPC补题

广州2022CCPC补题

时间:2022-11-14 21:25:12浏览次数:74  
标签:广州 sz int rep 2022CCPC 感染 补题 dp mod

I Infection

知识点: 树上背包

第一次写树上背包的题目,没想到就是在区域赛中
神奇的是树上背包的复杂度,看起来是\(O(n^3)\),但是实际计算只有\(O(n^2)\)

学会树上背包后可以很明显[1]的发现这是一道树上背包的题目
而我认为该题思路的难点[2]在于想到先枚举被感染的点集,再确定起始感染点是哪一个
所以我们就可以定义dp状态:
1.该点集是否包含起始感染点
2.以u为根的子树
3.该点集内被感染的点数
如果已经学过树上背包,此时就十分好转移了


#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define ll long long
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T>>;

const int mod = 1e9 + 7;
const int N = 2e3 + 5;

ll dp[2][N][N];

ll ksm(ll x, int n)
{
    ll ret = 1;
    while (n)
    {
        if (n & 1) ret = ret * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return ret;
}
vc<int> h[N];
ll p[N], w[N], ans[N];
int sz[N];


void dfs(int u, int fa)
{
    dp[0][u][0] = 1 - p[u]; //未选择初始感染点,u子树,0个感染点
    dp[0][u][1] = p[u];     //未选择初始感染点,u子树,1个感染点
    dp[1][u][1] = w[u];     //选择u为初始感染点,1个感染点

    sz[u] = 1;  //已合并节点个数
    
    for (auto v : h[u])
    {
        if (v == fa) continue;
        dfs(v, u);

        vc<ll> dp0(sz[u] + sz[v] + 1, 0), dp1(sz[u] + sz[v] + 1, 0);
        rep(i, 1, sz[u]) rep(j, 0, sz[v])
        {
            dp0[i + j] = (dp0[i + j] + dp[0][u][i] * dp[0][v][j]) % mod;
            dp1[i + j] = (dp1[i + j] + dp[1][u][i] * dp[0][v][j] + dp[0][u][i] * dp[1][v][j]) % mod;   
        }
        sz[u] += sz[v];
        //更新dp状态
        rep(i, 1, sz[u])
        {
            dp[0][u][i] = dp0[i];
            dp[1][u][i] = dp1[i];
        }
    }
    //统计答案
    rep(i, 1, sz[u]) ans[i] = (ans[i] + dp[1][u][i] * (1 - p[fa])) % mod;
}


int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    //init
    int n; cin >> n;
    rep(i, 2, n)
    {
        int u, v; cin >> u >> v;
        h[u].push_back(v);
        h[v].push_back(u);
    }
    ll wi(0);
    rep(i, 1, n)
    {
        int a, b, c;
        cin >> a >> b >> c;
        wi += w[i] = a;
        p[i] = b * ksm(c, mod - 2) % mod;
    }
    wi = ksm(wi, mod - 2);
    rep(i, 1, n) w[i] = w[i] * wi % mod;

    //树上背包
    dfs(1, 0);

    //输出答案
    rep(i, 1, n) cout << (ans[i] % mod + mod) % mod << endl;
    return 0;
}

M XOR Sum

先占坑


  1. 当起始感染点被确定后,其它点被感染只有当其父亲被感染时才会被感染 ↩︎

  2. 也可能只是我菜,写的题太少没见过 ↩︎

标签:广州,sz,int,rep,2022CCPC,感染,补题,dp,mod
From: https://www.cnblogs.com/lunasama/p/16890445.html

相关文章

  • 2022 CCPC广州 I Infection
    Infection树形dp\(dp[u][k][0/1]\)表示以\(u\)为根的子树,有\(k\)个感染的结点,无/有感染源的概率统计答案的时候要乘上父节点不被传染的概率,表示只传染该子树,不蔓......
  • 2022 CCPC广州 C Customs Controls 2
    CustomsControls2并查集+拓扑看了题解之后补的,题解写挺好的考虑到\(1\)距离相等的点进行并查集合并(指向同一个点的点,到\(1\)的距离相等),缩点后重新建边,判断是否......
  • U3D游戏研发-广州深圳(40-60W)
    岗位要求1.3年以上的客户端(引擎相关)开发经验2.扎实的编程基础,熟悉c/c++,c#,良好的逻辑思维能力,沟通能力,学习能力,有责任心3.对计算机图形学,图形算法,渲染技术......
  • 2022 CCPC 广州站 Alice and Her Lost Cat
    1#include<bits/stdc++.h>2usingnamespacestd;3#definergregister4#definelllonglong5#defineldlongdouble6#defineFOR(i,a,b)for(r......
  • 【广州华锐互动】15年经验的广州VR虚拟现实开发公司,专业vr内容制作平台
    元宇宙的崛起给VR产业带来了新的发展机遇,目前VR市场趋向火热,VR+游戏和VR+电商的应用已经先行一步,技术已相对成熟,而未来,VR将覆盖更多行业,医疗、教育、Live、以及旅游等领域......
  • 2022.11.13:CCPC广州
    补题传送门3题铁这把铁没有沈阳铜那么不甘心(沈阳打完之后,一星期都睡不好),看到了队伍内很多知识点的缺失,不知道在剩下一个正式赛来之前能不能弥补上(跟去年一样,做北大出的......
  • 22.11.13 CCPC 广州站 记录
    上来看A(树上DP),直观认为可做,前后拉着队友研究了两个小时,经过lcx,lgy两次hack正确性,最终基本得到答案思路,因为过于复杂和担心正确性问题不敢写。反思:1.正式比赛中不应该一开......
  • Codeforces Round #786 (Div. 3) 补题记录
    小结:A,B,F切,C没写1ll对照样例才发现,E,G对照样例过,D对照样例+看了其他人代码(主要急于看后面的题,能调出来的但偷懒了。CF1674ANumberTransformation考虑若\(y\)......
  • 三维实现广州的行政区划
    效果记录一下智慧广州行政区划制作显示效果需要相机调到正北位置,俯视即可。看似复杂o(╯□╰)o实际上就是画几个​​polygon3d​​再打上marker点就完事了,一般分为几层(最顶......
  • 广州华锐互动:vr模拟电力场景安全应急培训,为电力行业保驾护航
    近年来,电力行业得到快速发展,这对于电力安全管理提出了更高的要求,只有把电力安全管理工作做好,才能促进电力行业的健康发展。目前电力生产安全事故并不少见,这也反映了电力行......