首页 > 其他分享 >2022 China Collegiate Programming Contest (CCPC) Guangzhou Onsite I

2022 China Collegiate Programming Contest (CCPC) Guangzhou Onsite I

时间:2022-11-15 14:26:23浏览次数:45  
标签:Onsite sz Contest int res Guangzhou 枚举 dp mod

I. Infection

n=2000,我们考虑dp
我们转化题意
发现就是找一个连通子块 然后连通块的权重就是其中任何一个点的a[i]其他都是p[i]
但是对于连通块相接的点 我们都要让他是(1-p[i])
因为有选定源点这一个条件 我们本来的dp[i][j]还要加一维[0/1]
表示 第i个节点 我们子树中有j个感染点 并且是否(1/0)选定了源点
对于转移我们能想到的就是
枚举 i,j 根节点dp[u][i][0/1] 子节点的dp[v][j][0/1]乱搞一下
但是i枚举范围变成sz[u] j枚举范围变成sz[v] 之后时间复杂度是O(n)的
然后我们会枚举n个点所以复杂度就是O(n^2)的 跑的飞快
最后注意我们dp只考虑了子树的 我们最后还要让他的父节点是不准感染的

int qmi(int a, int b, int p){
    int res = 1;
    while(b){
        if(b & 1) res = res * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return res;
}
int inv(int x){
    return qmi(x,mod-2,mod);
}
vector<int>g[N];
int n,a[N],b[N],c[N],p[N],dp[N][2][N],sz[N],ans[N];//dp[i][j][k]表示i节点0/1有源点子树有k个点的概率
void dfs(int u, int fa) {
    sz[u]=1;
    dp[u][0][1]=p[u];
    dp[u][1][1]=a[u];
    dp[u][0][0]=(1-p[u]+mod)%mod;
    for(auto v:g[u]){
        if(v==fa)continue;
        dfs(v,u);
        sz[u]+=sz[v];
        int tmp[2][n+10];
        memset(tmp,0,sizeof tmp);
        for(int i=1;i<=sz[u]-sz[v];i++){
            for(int j=0;j<=sz[v];j++){
                (tmp[1][i+j]+=dp[u][1][i]*dp[v][0][j]%mod)%=mod;
                (tmp[1][i+j]+=dp[u][0][i]*dp[v][1][j]%mod)%=mod;
                (tmp[0][i+j]+=dp[u][0][i]*dp[v][0][j]%mod)%=mod;
            }
        }
        for(int i=1;i<=sz[u];i++){
            dp[u][0][i]=tmp[0][i];
            dp[u][1][i]=tmp[1][i];
        }
    }
    for(int i=1;i<=n;i++)
        (ans[i]+=dp[u][1][i]*(1-p[fa]+mod)%mod)%=mod;
}
void solve() {
    cin >> n;
    for (int i = 1; i <= n - 1; i++) {
        int u, v; cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i] >> b[i] >> c[i];
        sum += a[i];
        p[i] = (b[i] * inv(c[i])) % mod;
        sum %= mod;
    }
    for(int i=1;i<=n;i++){
        a[i]=a[i]*inv(sum)%mod;
    }
    dfs(1,0);
    for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
}

标签:Onsite,sz,Contest,int,res,Guangzhou,枚举,dp,mod
From: https://www.cnblogs.com/ycllz/p/16892249.html

相关文章

  • Biweekly Contest 91
    BiweeklyContest91ProblemANumberofDistinctAverages思路按照题意模拟即可,最后set的大小就是所求结果代码classSolution:defdistinctAverages(self,nu......
  • Weekly Contest 318
    WeeklyContest318ProblemAApplyOperationstoanArray思路按照题意模拟即可代码classSolution:defapplyOperations(self,nums:List[int])->List[int......
  • [Leetcode Weekly Contest]319
    链接:LeetCode[Leetcode]2469.温度转换给你一个四舍五入到两位小数的非负浮点数celsius来表示温度,以摄氏度(Celsius)为单位。你需要将摄氏度转换为开氏度(Kelvin)和华......
  • AtCoder Beginner Contest 277 (F,G,Ex)
    之前没细想过OSU那个题,被G薄纱,F也没写完,输麻了懒得放链接,代码可以直接去AtCoder上搜。ID:YunQianQwQF首先求出每列的最大最小值,然后依此排序,如果出现insertion......
  • 2022 China Collegiate Programming Contest (CCPC) Weihai Site
    比赛链接:https://codeforces.com/gym/104023A.Dunai题意:\(n\)个队伍获得过冠军,告知每个队伍中的人及对应的位置,现在已知\(m\)个选手及它们的位置,问能组成多少个五......
  • AtCoder Beginner Contest 277 E // 最短路
    CrystalSwitches题目来源:AtCoderBeginnerContest277E-CrystalSwitches题目链接:E-CrystalSwitches(atcoder.jp)题意给定一个\(N\)个点\(M\)条边的无向图。......
  • The 2021 ICPC Asia Shenyang Regional Contest B
    B.BitwiseExclusive-ORSequence我们考虑一种构造方式就是让一个点为0然后连接他的就一直异或上他连接的目标这样虽然不能符合题意达到最小但是我们可以发现这个如......
  • (AtCoder Beginner Contest 277)E(分层图+最短路 or bfs搜两种状态)
    E-CrystalSwitches题目大意:给你n个点,m条边,连接成一个无向图,每个边最初有一个状态(0or1)表示是否能够通过,同时给k个开关位于k的顶点上,每次点击开关会使得所有路的状......
  • AtCoder Beginner Contest 277 D Takahashi's Solitaire
    Takahashi'sSolitaire双指针&&尺取先排个序,然后把数组扩展到\(2\timesn\),为了处理循环的情况然后双指针跑一下,限定\(r\)扩展的条件为:当前数字等于前一个或者......
  • AtCoder Beginner Contest 277 F Sorting a Matrix
    SortingaMatrix拓扑序首先可以明确无论怎么交换行列,原本在同一行或者同一列的元素,还是会处于同一行或者同一列条件一每行每行地看,如果能满足从小到大的条件,说明第......