AtCoder Beginner Contest 214 (D并查集,E反悔贪心,F公共子序列DP)
题目链接:Here
ABC水题,
D - Sum of Maximum Weights
上图中最大权 \(9\) 对答案的贡献是这条边两边的连通块的 size 的乘积再乘以 9
受到上面的启发,我们可以把每条边按边权大小从小到大排序。对于每条边(边权记为 \(w\)),先求出当前边连接的两个 group 的 size,不妨记为 \(size_a\) 和 \(size_b\) ,再把 \(size_a \times size_b \times w\) 累加后合并两个连通块(并查集)
这里偷懒用一下 atcoder 的库函数写。
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
int main() {
int n;
cin >> n;
vector<tuple<long long, int, int>> p(n - 1);
for (auto &[w, u, v] : p) {
cin >> u >> v >> w;
u--; v--;
}
sort(p.begin(), p.end());
long long ans = 0;
dsu uf(n);
for (auto [w, u, v] : p) {
if (!uf.same(u, v)) {
ans += w * uf.size(u) * uf.size(v);
uf.merge(u, v);
}
}
cout << ans << endl;
return 0;
}
E - Packing Under Range Regulations
题意理解来自 Ncik桑
本题显然是区间调度问题(反悔贪心问题),和以下问题等价:
- 有 \(N\) 个工作。 第 \(i\) 个工作可以从 \(L_i\) 日开始,截止日期为 \(R_i\) 日。 任何一项工作都可以在一天内完成,一天最多只能完成一项工作。 你能在截止日期前完成所有工作吗?
显而易见的,我们应该从最紧急的工作开始,即把任务按 \(L\) 从大到小排列然后用优先级队列按 \(R\) 的大小顺序检索 “你现在可以做的任务 “来模拟这种情况。
const int inf = 1001001001;
void solve() {
int n; cin >> n;
vector<pair<int, int>> a(n);
for (auto &[u, v] : a) cin >> u >> v;
sort(a.begin(), a.end());
priority_queue<int, vector<int>, greater<int>>q;
int x = 1;
a.push_back({inf, inf});
for (auto [l, r] : a) {
while (x < l && q.size()) {
if (q.top() < x) {
cout << "No\n";
return ;
}
q.pop(); x += 1;
}
x = l; q.push(r);
}
cout << "Yes\n";
}
F - Substrings
首先,让我们考虑不受相邻字符不同时选择的约束的问题。
查找S的非空子字符串的数目。在这里,子字符串是在删除0个或更多字符的情况下不重新排序原始字符串的串联。
在这里,重要的是不同的删除方式可能会导致相同的子字符串。这里会用“公共子序列DP”的方法解决问题,在该方法中,子字符串的计数不包含那些重复项。
考虑下面的DP。
考虑下面的DP
- \(dp_i\):= 字符串中第 \(1\) 个到第 \(i\) 个字符串的数目,
定义 \(dp_{p_0} = 1\) 对应于一个空字符串。转换可以写为以下内容:
- \(dp_i = \sum_{j = 0}^{i - 1}dp_j\)
但可能会多次计算相同子字符串,所以稍微修改一下
- \(dp_i = \sum_{j = k}^{i - 1}dp_j\) ,其中 \(k\) 为最大整数使得 \(S_i = S_k\ (k < i)\) 如果没有这样的整数则 \(k = 0\)
直观地说,如果 \(S_k = S_i\) ,那么我们禁止在某些 \(j(<k)\)的 \(S_j\) 后面追加 \(S_i\) ,因为这没有意义(我们可以在 \(S_j\) 后面追加 \(S_k\)),这样就避免了重复。事实上,这是计算所有不重复的子字符串所需的唯一扭曲。
乍一看,复杂度看起来像 \(\mathcal{O}(|S|^2)\),但实际上,借助累积和,它可以总共执行 \(\mathcal{O}(|S|)\),或者在没有累积和的情况下执行 \(\mathcal{O}(σ|S|)\),其中 \(σ\) 表示不同字母的数量,这足够快了。
这个想法也可以应用于原始问题。设 \(dp_0 = 1\) 和 \(dp_1=0\) 。
递归关系可以写成:\(dp_{i+1} = \sum_{j = k}^{i - 1}dp_j\) ,其中 \(k\) 是最大整数,使得 \(S_i=S_k\) 和 \(k<i\)(如果没有这样的整数,则 \(k=0\) )
const int mod = 1e9 + 7;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
string s; cin >> s;
int n = s.size();
vector<ll> f(n + 2); f[0] = 1;
for (int i = 0; i < n; ++i)
for (int j = i - 1;; j--) {
f[i + 2] = (f[i + 2] + f[j + 1]) % mod;
if (j == -1 || s[j] == s[i]) break;
}
ll ans = 0;
for (int i = 2; i < n + 2; i++) ans += f[i];
cout << ans % mod << "\n";
}
AtCoder Beginner Contest 214 (D并查集,E反悔贪心,F公共子序列DP)的更多相关文章
- XJOI 3578 排列交换/AtCoder beginner contest 097D equal (并查集)
题目描述: 你有一个1到N的排列P1,P2,P3...PN,还有M对数(x1,y1),(x2,y2),....,(xM,yM),现在你可以选取任意对数,每对数可以选取任意次,然后对选择的某对数(xi, ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- AtCoder Beginner Contest 238 A - F 题解
AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
随机推荐
- mongodb c driver bson的嵌套访问与层次结构
使用c访问mongodb,需要用到mongodb c driver.c++的driver也是基于c driver封装的. 在使用c driver访问mongodb时,需要与bson打交道,不过c dr ...
- Linux笔记02: Linux环境_2.2 Linux系统安装
2.2 Linux系统 本文使用的Linux系统为CentOS 7.9.2009,读者可以根据自己的需要选择不同的版本. 2.2.1 CentOS版本 CentOS基本上是安装在i386.x86_64 ...
- [cnn]cnn训练MINST数据集demo
[cnn]cnn训练MINST数据集demo tips: 在文件路径进入conda 输入 jupyter nbconvert --to markdown test.ipynb 将ipynb文件转化成m ...
- 一文讲透消息队列RocketMQ实现消费幂等
这篇文章,我们聊聊消息队列中非常重要的最佳实践之一:消费幂等. 1 基础概念 消费幂等是指:当出现 RocketMQ 消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次 ...
- 从 ECMAScript 6 角度谈谈执行上下文
大家好,我是归思君 起因是最近了解JS执行上下文的时候,发现很多书籍和资料,包括<JavaScript高级程序设计>.<JavaScript权威指南>和网上的一些博客专栏,都是 ...
- Selenium-[实例]猫眼电影爬取
import random import time from selenium import webdriver from selenium.webdriver import ActionChains ...
- 数字孪生为何通过融合GIS系统能够更好地助力智慧城市发展?
随着城市化进程的不断加速,智慧城市建设已成为许多城市发展的重要方向.在智慧城市中,数字孪生技术和GIS系统的融合,为城市发展带来了全新的可能性和机遇.数字孪生是一种将物理世界和数字世界相结合的技术,通 ...
- Python——第三章:函数的定义
函数的定义: 对某一个特定的功能或者代码块进行封装. 在需要使用该功能的时候直接调用即可 格式: def 函数的名字(): 被封装的功能或者代码块->函数体 调用: 函数的名字() 使用函数的好 ...
- Windows手工入侵排查思路
文章来源公众号:Bypass Windows系统被入侵后,通常会导致系统资源占用过高.异常端口和进程.可疑的账号或文件等,给业务系统带来不稳定等诸多问题.一些病毒木马会随着计算机启动而启动并获取一定的 ...
- MYSQL事务篇(高级篇)
1.事务介绍: 一般是指要做的或所做的事情. 在计算机 术语 中是指访问并可能更新数据库中各种 数据项 的一个程序 执行单元 (unit) 2.数据库事务具有ACID四大特性. ACID是以下4个词的 ...