首页 > 其他分享 >牛客练习赛102

牛客练习赛102

时间:2022-09-02 21:59:41浏览次数:62  
标签:pre 练习赛 sub fa int ll 牛客 102 mod

A

对所有消息做一下前缀和,对每个人的消息做一下前缀和,分别判断是否有长度为 \(a,b\) 的连续段

B

考虑当前已经算出来前 \(i-1\) 个操作的最大值 \(x\),那么第 \(i\) 个操作会把答案变为 \(\max(x+a_i,x \cdot b_i)\)

但是答案可能会爆ll,所以需要记录一下\(x\) 是否曾经大于 \(10^9\),如果曾经大于 \(10^9\) 的话,只要 \(b_i \ne 1\),那么就会选择 \(b_i\)

C

bool operator < (T a, T b) {
    return a.r == b.r ? a.l < b.l : a.r < b.r;
}

排了个序跑暴力就过了?

D

换根dp,分别dfs两遍

ll f[N], g[N]; // f: 子树中连通块个数;g: 与u相连的连通块个数 
void dfs(int u, int fa) {
    f[u] = g[u] = 1;
    for(int i = head[u] ; i ; i = rest[i]) {
        int v = to[i];
        if(v == fa) continue;
        dfs(v, u);
        ll newf = (f[u] + f[v] + g[u] * g[v] % mod) % mod;
        ll newg = (g[u] + g[u] * g[v] % mod) % mod;
        f[u] = newf;
        g[u] = newg;
        ans[id[i]][a[id[i]] == v ? 0 : 1] = f[v];
    }
//    printf("%d: f=%lld g=%lld\n", u, f[u], g[u]);
}

ll h[N], w[N]; // h: 不选子树的方案数;w: 不选子树包含u的方案数 

void dfs2(int u, int fa) {
    vector<ll> pre, sub;
    ll allsum = 0;
    for(int i = head[u] ; i ; i = rest[i]) {
        int v = to[i];
        if(v == fa) continue;
        pre.push_back((g[v] + 1) % mod);
        sub.push_back((g[v] + 1) % mod);
        allsum = (allsum + f[v]) % mod;
    }
    
    int n = pre.size(), idx = 0;
    for(int i = 1 ; i < n ; ++ i) pre[i] = pre[i - 1] * pre[i] % mod;
    for(int i = n - 2 ; i >= 0 ; -- i) sub[i] = sub[i + 1] * sub[i] % mod;
    for(int i = head[u] ; i ; i = rest[i]) {
        int v = to[i];
        if(v == fa) continue;
        ll cnt = (idx ? pre[idx - 1] : 1) * (idx + 1 < n ? sub[idx + 1] : 1) % mod * w[u] % mod; // 与u连通,不经过v子树的方案数 
        ll cutans = (cnt + h[u] - w[u] + allsum - f[v]) % mod;
        ans[id[i]][a[id[i]] == u ? 0 : 1] = cutans;
        
        w[v] = (cnt + 1) % mod;
        h[v] = (cutans + w[v]) % mod;
        
        ++ idx;
    }
    
    for(int i = head[u] ; i ; i = rest[i]) {
        int v = to[i];
        if(v == fa) continue;
        dfs2(v, u);
    }
}

E

F

标签:pre,练习赛,sub,fa,int,ll,牛客,102,mod
From: https://www.cnblogs.com/nekko/p/16651323.html

相关文章

  • 2022牛客暑假多校01B[Spirit Circle Observation]
    2022牛客暑假多校01B[SpiritCircleObservation]大致题意给出一个长度为\(n\)的字符串\(s\),求有多少个子串对\((A,B)\),满足\(1.|A|=|B|\)\(2.\overline{A}+1=......
  • 2022牛客多校第8场 I.Equivalence in Connectivity
    题目大意给定一张\(n\)个点\(m\)条边的无向图,定义两张图\(G_1\)和\(G_2\)连通性等价,当且仅当\(\forallu,v\inG_1\),只要在\(G_1\)中\(u\)和\(v\)连通,一定......
  • 2022牛客多校 第9场 C Global Positioning System(讨论+lca+树上差分)
    传送门若干条路径生成了一个无向连通图,只有所有简单回路对应的向量为\(0\)向量时合法。需要改变的边是满足这个边是所有不为\(0\)回路的交且不属于所有为\(0\)的回路。......
  • "蔚来杯"2022牛客暑期多校训练营10 E.Reviewer Assignment
    E.eviewerAssignment题目大意有m篇论文和n个审稿人,给出每个审稿人能审论文的集合,要求给没个审稿人安排一篇论文。令f(i)表示被至少i个审稿人审过的论文数量,要求求出一种......
  • 牛客小白月赛56 A-F
    C题应该是最好的一道题 A阿宁的柠檬分析:酸度是[1,a]甜度是[0,b]总共有n个柠檬,问最小快乐值和最大快乐值最小就是n最大就是n*(a+b)voidsolve(){......
  • PAT Advanced 1029 Median(25)
    题目描述:GivenanincreasingsequenceSofNintegers,themedianisthenumberatthemiddleposition.Forexample,themedianofS1={11,12,13,14}is1......
  • 8.27训练赛(2018-2019, ICPC, Asia Yokohama Regional Contest 2018,gym102082)
    B一开始开题的时候想假了,以为用map存差的结果贪心就行了,实际上是一个比较妙的dp,用到了一个结论:两项就唯一确定一个等差数列。设\(f[i,j]\)表示最后两个数选了\(a_i\),\(a......
  • 牛客小白月赛56 A-F
    牛客小白月赛56A-Fhttps://ac.nowcoder.com/acm/contest/39100一场简单的比赛就足以验证我是多么的弱智。。。A-阿宁的柠檬求最大最小,签到。注意会爆\(int\)#inc......
  • 牛客-最长和谐连续子序列
    时间限制:C/C++1秒,其他语言2秒空间限制:C/C++256M,其他语言512M和谐连续序列是指一个连续序列中元素的最大值和最小值之间的差值正好是1。现在,给定一个整数数组,你需要......
  • 牛客小白月赛56
    A分别输出\(n,(a+b)n\)B输出\(m\)个\(1\)C对\((2^i,i)\)排序,对\(a_i\)排序,从小到大依次放入ans数组D求出小于等于\(10^7\)的所有素数,用set存起来,依次删......