AtCoder Beginner Contest 163 (6/6)
比赛链接: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)的更多相关文章
- AtCoder Beginner Contest 254(D-E)
Tasks - AtCoder Beginner Contest 254 D - Together Square 题意: 给定一个N,找出所有不超过N的 ( i , j ),使得( i * j )是一 ...
- AtCoder Beginner Contest 086 (ABCD)
A - Product 题目链接:https://abc086.contest.atcoder.jp/tasks/abc086_a Time limit : 2sec / Memory limit : ...
- AtCoder Beginner Contest 085(ABCD)
A - Already 2018 题目链接:https://abc085.contest.atcoder.jp/tasks/abc085_a Time limit : 2sec / Memory li ...
- AtCoder Beginner Contest 084(AB)
A - New Year 题目链接:https://abc084.contest.atcoder.jp/tasks/abc084_a Time limit : 2sec / Memory limit ...
- AtCoder Beginner Contest 083 (AB)
A - Libra 题目链接:https://abc083.contest.atcoder.jp/tasks/abc083_a Time limit : 2sec / Memory limit : 2 ...
- AtCoder Beginner Contest 163
比赛链接:https://atcoder.jp/contests/abc163/tasks A - Circle Pond 题意 由半径输出圆周长. 代码 #include <bits/stdc ...
- AtCoder Beginner Contest 264(D-E)
D - "redocta".swap(i,i+1) 题意: 给一个字符串,每次交换相邻两个字符,问最少多少次变成"atcoder" 题解: 从左到右依次模拟 # ...
- Atcoder Beginner Contest 121D(异或公式)
#include<bits/stdc++.h>using namespace std;int main(){ long long a,b; cin>>a>&g ...
- Atcoder Beginner Contest 156E(隔板法,组合数学)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ; ; long long fac[N] ...
- Atcoder Beginner Contest 155E(DP)
#definde HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ]; int main(){ ios: ...
随机推荐
- 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 #include<intrins.h> //因为要用到左右移函数,所以加入这个头文件 ...
- 2019牛客国庆集训派对day3 G排列(状压dp)
题目传送门 一道很好的状压DP,状态是当前的占位情况,排序操作和第21次CSP认证的第四题作用类似. #include<cstdio> #include<vector> #in ...
- 基于DotNetty实现一个接口自动发布工具 - 通信实现
基于 DotNetty 实现通信 DotNetty : 是微软的 Azure 团队,使用 C#实现的 Netty 的版本发布.是.NET 平台的优秀网络库. 项目介绍 OpenDeploy.Commu ...
- .NET企业应用安全开发动向-概览
太长不读版:试图从安全的全局视角触发,探讨安全的重要性,讨论如何识别安全问题的方法,介绍.NET提供的与安全相关的基础设施,以及一些与时俱进的安全问题,为读者建立体系化的安全思考框架. 引言 关于&q ...
- 理解Mysql索引原理及特性
作为开发人员,碰到了执行时间较长的sql时,基本上大家都会说"加个索引吧".但是索引是什么东西,索引有哪些特性,下面和大家简单讨论一下. 1 索引如何工作,是如何加快查询速度 索引 ...
- CICD实践1:环境安装篇
一.CICD技术选型 配置管理工具 工具 需求管理工具 使用禅道 代码管理工具 使用Gitlab 编译构建工具 搭建Jenkins,使用Jenkinsfile 制品库工具 nexus 文档管理工具 C ...
- 如何根据月份查询每月Xxx的总数
我以我的项目根据月份查询每月新增会员的总数为例 Controller @GetMapping("/getMemberReport.do") public R getMemberRe ...
- 什么是革命性技术eBPF?为什么可观测性领域都得用它
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 如果有一种技术可以监控和采集任何应用信息,支持任何语言,并且应用完全无感知,零侵入,想想是不是很激动,那么这个技术是什么呢 ...
- 关于 K8s 的一些基础概念整理
〇.前言 Kubernetes,将中间八个字母用数字 8 替换掉简称 k8s,是一个开源的容器集群管理系统,由谷歌开发并维护.它为跨主机的容器化应用提供资源调度.服务发现.高可用管理和弹性伸缩等功能. ...
- PersistenceException、ReflectionException、IllegalArgumentException、wrapException持久性异常 反射异常 非法参数异常 包装异常
PersistenceException.ReflectionException.IllegalArgumentException.wrapException wrapException 持久性异常 ...