首页 > 其他分享 >Codeforces Round 975 (Div. 2) CE

Codeforces Round 975 (Div. 2) CE

时间:2024-09-29 17:34:54浏览次数:10  
标签:975 int sum Codeforces dep cnt Div sonmxdep define

来源:Codeforces Round 975 (Div. 2)

C. Cards Partition

题意

本身有 \(a_i\) 张 \(i\) 牌,现在将牌分成若干份,每一份牌数相等,且每一份都由不同的牌组成

同时有 \(k\) 次补充任意牌的机会,求最多分成一份几张牌

思路

假定分成 \(m\) 份,每份 \(p\) 张牌,那么所有牌加补充的牌等于\(m*p\)

同时,分成了 \(m\) 份说明每种牌不能超过 \(m\) 张,要不然用不完

那么根据 \(p\) 来枚举,\(p\) 最低为 \(1\),最高为 \(n\),再用牌的总数判断能否满足要求

代码

int solve() {
    int n, k;
    cin >> n >> k;
    int sum = 0;
    int mi = 0;
    rep(i, 0, n) {
        cin >> arr[i];
        sum += arr[i];
        mi = max(mi, arr[i]);
    }
  
    int ksum = sum + k;
    int ans = -1;
   
    for (int p = 1; p <= n; p++) {
        int m = ksum / p;
        // 分成的m份都要大于数组的最大值
        // 分成的m份和p大小,要在sum和sum+k中间
        if (m >= mi && m * p >= sum && m * p <= ksum) ans = p;
    }
    return ans;
}

E. Tree Pruning

题意

给树,要求每次减去叶子,让所有的叶子结点在同一层,求最少次数

思路

对于想让所有叶子结点在 \(k\) 层,比 \(k\) 深的子树需要减到 \(k\),比 \(k\) 浅的需要剪到根

也就是说

  1. 所有深度比deep深的结点都要减去
  2. 所有子树深度比deep浅的结点都要减去

代码

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

#define endl "\n"
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define rep(i, j, k) for (int i = (j); i < (k); i++)
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
const int N = 5e5 + 10;
vector<int> g[N];

int depth_cnt_sum[N];
int son_depth_cnt_sum[N];

int mxdep = 0; // 整棵树的最大深度

// 返回最深的儿子深度
int dfs(int i, int f, int dep) {
    depth_cnt_sum[dep]++;
    mxdep = max(mxdep, dep);

    int sonmxdep = dep;
    for (int j = 0, v; j < g[i].size(); j++) {
        v = g[i][j];
        if (v == f) continue;
        sonmxdep = max(sonmxdep, dfs(v, i, dep + 1));
    }
    son_depth_cnt_sum[sonmxdep]++;
    return sonmxdep;
}

void init(int n, int mx) {
    mxdep = 0;
    for (int i = 0; i <= mx; i++) {
        depth_cnt_sum[i] = 0;
        son_depth_cnt_sum[i] = 0;
    }
    for (int i = 1; i < n; i++) g[i].clear();
}

// 1. 所有深度比deep深的结点
// 2. 所有子树深度比deep浅的结点
int get(int deep) {
    return depth_cnt_sum[mxdep] - depth_cnt_sum[deep] + son_depth_cnt_sum[deep - 1];
}
void solve() {
    int n;
    cin >> n;
    rep(i, 0, n - 1) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    dfs(1, 0, 1);

    for (int i = 1; i <= mxdep; i++) {
        depth_cnt_sum[i] += depth_cnt_sum[i - 1];
        son_depth_cnt_sum[i] += son_depth_cnt_sum[i - 1];
    }
    int ans = 1e9;
    for (int deep = 1; deep <= mxdep; deep++) {
        ans = min(ans, get(deep));
    }
    cout << ans << endl;
    init(n + 1, mxdep);
}

int main() {
    IOS;
    int t;
    cin >> t;
    init(N, N - 1);
    while (t--) solve();
    return 0;
}

标签:975,int,sum,Codeforces,dep,cnt,Div,sonmxdep,define
From: https://www.cnblogs.com/lulaalu/p/18440463

相关文章

  • Codeforces Round 975 (Div. 2) A~F 题解(Div.1 A~D)
    CodeforcesRound975(Div.2)A~F题解(Div.1A~D)也是补完整场了。A.MaxPlusSize枚举最大值的位置,使长度最长,更新答案。B.AllPairsSegments每个线段内部的点的答案都是一样的,在处理一下线段两边边界的点。被包含次数就是左边\(\times\)右边。用\(map\)记录答案......
  • Codeforces Round 975 (Div. 2)
    目录写在前面A签到B排序,模拟C数学,贪心D模拟,思维E树,贪心,暴力or长链剖分F贪心,枚举写在最后写在前面比赛地址:https://codeforces.com/contest/2019。唉唉不敢打div1只敢开小号打div2太菜了。A签到显然最优方案只有两种——取所有奇数位置或所有偶数位置。///*By......
  • Codeforces Round 975 (Div. 2) A-E
    人生中第一次正常\(div2\)爆写5题。cf给我正反馈最大的一次A直接找到最大的数字的位置,然后判断一下这个数字的位置下标的奇偶性就好了。然后如果有多个最大的就取奇数位置的。这样可以算出来一定是最优解#include<bits/stdc++.h>#definelllonglongusingnamespacestd;inl......
  • Codeforces Round 975 Div.2 C题 解析
    C题题目链接:Problem-C-Codeforces题目描述思路......
  • Codeforces Round 975 (Div. 2) 题解:D、E
    第一次进前50,上分最爽的一次D.Speedbreaker对\(a\)按照时间升序排序,不难发现,对于升序排序后的数组,当我们搜到时间\(t\)时,记录已经搜过的时间对应原城市编号最小值为\(l\),最大值为\(r\),则我们一定要在\(a_t\)时间之前走过所有\([l,r]\)之间的城市。则若\(r-l+1>a_t\)则无解,因......
  • Codeforces Round 944 (Div. 4) A~G题解
    A\(min\)函数和\(max\)函数的使用,按照格式输出即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;voidsolve(){intx,y;cin>>x>>y;cout<<min(x,y)<<'......
  • Codeforces Round 973题解(E)
    E.PrefixGCD假设我们从一个空集合\(b\)开始,不断从\(a\)数组中选择一个元素添加到\(b\)集合的尾部,当把\(a\)数组的元素全部添加到\(b\)中后,得到的\(b\)即为所求的rearrange后的\(a\)。结论1:每次选择使得其和当前\(b\)中所有元素的最大公约数最小的那个\(a_i\)加入到\(b\)的末......
  • [CERC2015] Digit Division 题解
    \(O(n^2)\)做法和大部分人最开始一样,我也想的是DP。设\(dp_i\)表示用前面\(i\)个字符拆分得到的答案。既然是统计方案数,我们肯定是根据前面的答案累加。考虑在\([1,i-1]\)中选择一个\(j\),如果\([j+1,i]\)的字符组成的数字能够被\(m\)整除,那么\(dp_i\)就可以累加......
  • codeforces round 971(div4)E(二分答案,禁用数学方法)
    解题历程:开始想的是用数学公式的方法,利用公式推出二次函数,再求出根,再用根求出答案,检查了一个小时,结果怎么改都有细微的偏差,最后发现答案先单调递减在单调递增,那么可以用二分答案的方法查找最小的答案,二分对细节的处理要求比较高,于是在二分中加入了一个限制,当二分的区间小于5时,就......
  • [ABC234G] Divide a Sequence
    [ABC234G]DivideaSequence给定长度为\(N\)的序列\(A\),我们定义一种将\(A\)划分为若干段的方案的价值为每一段的最大值减去最小值的差的乘积,你需要求出所有划分方案的价值的总和,答案对\(998244353\)取模。$1\\leq\N\\leq\3\\times\10^5$$1\\leq\A_i\\leq......