比赛链接:Here

AB水题,

C - management

题意:给一棵 \(N(2\le N\le2e5)\)​ 个节点的有根树,求每个节点的儿子数。

思路:由于输入直接给的是每个节点的父节点,直接计数即可。

const int N = 2e5 + 10;
int a[N];
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n; cin >> n;
for (int i = 1, x; i < n; ++i)
cin >> x, a[x] += 1;
for (int i = 1; i <= n; ++i) cout << a[i] << "\n";
}

D - Sum of Large Numbers

题意:当前有 \(N + 1\) 个整数:\(10^{100},10^{100}+1,...,10^{100}+N\),求取不少于 \(K\) 个数的和的可能值的数量(mod 1e9+7)。

数据范围:\(1\le N\le 2e5,1\le K\le N +1\)

思路:因为 \(10^{100}\) 明显很大,所以取 \(K\) 个总和不可能等于取 \(K+1\) 个数的综合,所以只需要枚举取多少个数即可。

对于取 \(K\) 个数可以求出取 \(K\) 个值的最小最大值,在这两个值之间的值都可以取到,个数就是最大值-最小值+1。

const int mod = 1e9 + 7;
int ans = 0;
void add(int &x, int y) {
x += y;
if (x >= mod) x -= mod;
if (x < 0) x += mod;
}
int cal(int l, int r) {
return 1ll * (l + r) * (r - l + 1) / 2 % mod;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n, k;
cin >> n >> k;
for (int i = k; i <= n + 1; i += 1)
add(ans, cal(n + 1 - i, n) - cal(0, i - 1) + 1);
cout << ans;
}

E - Active Infants

题意:有 \(N\) 个小孩,第 \(i\) 个孩子的位置为 \(i\),活跃值为 \(A_i\),现在将 \(N\) 个小孩重新排列,每个小孩获得的开心值为 \(A_i\) 与重新排列前后位置差的乘积,求最大可能的开心值总和。

数据范围:\(2\le N\le 2e3,1\le A_i\le 1e9\)

题解:可以发现将 \(A\) 较大的值放在边上更优,以A降序,然后就是一个区间dp,枚举当前值放左边、右边进行更新。

\(f[l][r]=\max \left(f[l+1][r]+A_{n o w} \times\left|p_{\text {now }}-l\right|, f[l][r-1]+A_{\text {now }} \times\left|p_{\text {now }}-r\right|\right)\)

const int N = 2e3 + 5;
ll f[N][N];
pair<int, int> p[N];
ll cal(int cnt, int l, int r) {
if (l > r) return 0;
if (~f[l][r]) return f[l][r];
ll ans = 1LL * p[cnt].first * abs(p[cnt].second - l) + cal(cnt + 1, l + 1, r);
ans = max(ans, 1LL * p[cnt].first * abs(p[cnt].second - r) + cal(cnt + 1, l, r - 1));
return f[l][r] = ans;
}
int main() {
int n; cin >> n;
for (int i = 1, x; i <= n; i++) {
scanf("%d", &x);
p[i] = {x, i};
}
sort(p + 1, p + n + 1, [](pair<int, int> a, pair<int, int> b) {
return a.first > b.first;
});
memset(f, -1, sizeof f);
cout << cal(1, 1, n);
return 0;
}

F - path pass i

题意:给一棵N个节点的无根树,每个节点有一个颜色属性c,对于每个颜色,求经过这种颜色的简单路径的数量。

数据范围:\(1\le c_i\le N\le 2e5\)

题解:把问题转换成不经过这种颜色的简单路径的数量,总数 \(f[N] = N*(N+1)/2\) 减去它即可。

其中不经过颜色 \(i\) 的简单路径的数量为:\(\sum\limits_{u !=v, u !=w, v !=w, c_{u}=c_{v}=i, \forall w \in \operatorname{path}(u, v), c_{u}=i} f[\operatorname{dis}(u, v)-1]_{\circ}\)​​

const int N = 2e5 + 5;
vector<int> G[N];
int C[N], num[N], sum[N];//num[i]代表i子树的节点数目,sum[i]代表以颜色为i的节点(其祖先没有颜色为i的节点)为根节点的子树大小总和
ll ans[N];
ll cal(int x) {
return 1LL * x * (x + 1) / 2;
}
void dfs(int u, int fa) {
int c = C[u], save = sum[c];
num[u] = 1;
for (auto v : G[u]) {
if (v == fa) continue;
int t = sum[c];
dfs(v, u);
int dt = sum[c] - t;
ans[c] -= cal(num[v] - dt);//num[v]-dt代表相邻两个节点之间的节点数
num[u] += num[v];
}
sum[c] = save + num[u];
}
int main() {
int n; cin >> n;
for (int i = 1; i <= n; i++) cin >> C[i];
for (int i = 1, u, v; i < n; i++) {
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= n; i++)
ans[i] = cal(n); dfs(1, -1);
for (int i = 1; i <= n; i++) {
int t = n - sum[i]; //多出来的节点还要减掉
ans[i] -= cal(t);
cout << ans[i] << "\n";
}
}

AtCoder Beginner Contest 163 (6/6)的更多相关文章

  1. AtCoder Beginner Contest 254(D-E)

    Tasks - AtCoder Beginner Contest 254 D - Together Square 题意: 给定一个N,找出所有不超过N的 ( i , j ),使得( i * j )是一 ...

  2. AtCoder Beginner Contest 086 (ABCD)

    A - Product 题目链接:https://abc086.contest.atcoder.jp/tasks/abc086_a Time limit : 2sec / Memory limit : ...

  3. AtCoder Beginner Contest 085(ABCD)

    A - Already 2018 题目链接:https://abc085.contest.atcoder.jp/tasks/abc085_a Time limit : 2sec / Memory li ...

  4. AtCoder Beginner Contest 084(AB)

    A - New Year 题目链接:https://abc084.contest.atcoder.jp/tasks/abc084_a Time limit : 2sec / Memory limit  ...

  5. AtCoder Beginner Contest 083 (AB)

    A - Libra 题目链接:https://abc083.contest.atcoder.jp/tasks/abc083_a Time limit : 2sec / Memory limit : 2 ...

  6. AtCoder Beginner Contest 163

    比赛链接:https://atcoder.jp/contests/abc163/tasks A - Circle Pond 题意 由半径输出圆周长. 代码 #include <bits/stdc ...

  7. AtCoder Beginner Contest 264(D-E)

    D - "redocta".swap(i,i+1) 题意: 给一个字符串,每次交换相邻两个字符,问最少多少次变成"atcoder" 题解: 从左到右依次模拟 # ...

  8. Atcoder Beginner Contest 121D(异或公式)

    #include<bits/stdc++.h>using namespace std;int main(){    long long a,b;    cin>>a>&g ...

  9. Atcoder Beginner Contest 156E(隔板法,组合数学)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ; ; long long fac[N] ...

  10. Atcoder Beginner Contest 155E(DP)

    #definde HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ]; int main(){ ios: ...

随机推荐

  1. 🔥🔥Java开发者的Python快速进修指南:实战之跳表pro版本

    之前我们讲解了简易版的跳表,我希望你能亲自动手实现一个更完善的跳表,同时也可以尝试实现其他数据结构,例如动态数组或哈希表等.通过实践,我们能够发现自己在哪些方面还有所欠缺.这些方法只有在熟练掌握之后才 ...

  2. 【scikit-learn基础】--『数据加载』之真实数据集

    上一篇介绍了scikit-learn中的几个玩具数据集,本篇介绍scikit-learn提供的一些真实的数据集.玩具数据集:scikit-learn 基础(01)--『数据加载』之玩具数据集 1. 获 ...

  3. Android 图表开源库调研及使用示例

    原文地址: Android图表开源库调研及使用示例 - Stars-One的杂货小窝 之前做的几个项目都是需要实现图表统计展示,于是做之前调研了下,做下记录 概述 AAChartCore-Kotlin ...

  4. [USACO2007NOVS] Cow Hurdles S

    题目描述 Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gan ...

  5. 神经网络优化篇:为什么正则化有利于预防过拟合呢?(Why regularization reduces overfitting?)

    为什么正则化有利于预防过拟合呢? 通过两个例子来直观体会一下. 左图是高偏差,右图是高方差,中间是Just Right. 现在来看下这个庞大的深度拟合神经网络.知道这张图不够大,深度也不够,但可以想象 ...

  6. bash shell笔记整理——tail命令

    作用 Print the last 10 lines of each FILE to standard output. With more than one FILE, precede each wi ...

  7. selenium滚动加载数据解决方案

    有些网站时一直滚动就会加载新数据的,在selenium中解决方法: def loaddata_by_scroll(self, driver): js = 'return document.body.s ...

  8. 加速计算,为何会成为 AI 时代的计算力“新宠” 审核中

    随着科技的发展,处理大量数据和进行复杂计算的需求越来越高,人工智能.大数据和物联网等领域更是如此,传统的计算方式已经无法满足这些需求.因此,加速计算作为一种现代计算方式,成了必要的手段.加速计算具有前 ...

  9. 普冉PY32系列(十四) 从XL2400迁移到XL2400P

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...

  10. eclipse工具使用

    eclipse下载 官网下载:https://www.eclipse.org/downloads/packages/ 打开后,找到Eclipse IDE for Java Developers点击进入 ...