AtCoder Beginner Contest 163 (6/6)
比赛链接:Here
AB水题,
C - management
题意:给一棵
思路:由于输入直接给的是每个节点的父节点,直接计数即可。
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
题意:当前有
数据范围:
思路:因为
对于取
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
题意:有
数据范围:
题解:可以发现将
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,对于每个颜色,求经过这种颜色的简单路径的数量。
数据范围:
题解:把问题转换成不经过这种颜色的简单路径的数量,总数
其中不经过颜色
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
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
2020-09-02 博弈论经典模型解析(入门级)
2020-09-02 Problem 1342B - Binary Period (思维)
2020-09-02 SCOI2005 互不侵犯 (状态压缩入门题)
2020-09-02 位运算的奇技淫巧(二)