【CF比赛记录】Educational Codeforces Round 175 (Rated for Div. 2)
Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录
比赛连接
手速场,上蓝场,但是有点唐,C 想错了写了半个多小时,想到正解不到
赛时切掉了 A - D,也算是成功渡劫上蓝了!
过题记录:
A. FizzBuzz Remixed
很明显,
void solve()
{
int n;cin >> n;
int ans = 0;
while(n % 15 != 0) {
if(n % 15 <= 2) {
ans ++;
}
n --;
}
ans ++;
ans += n / 15 * 3;
cout << ans << "\n";
}
B. Robot Program
很明显,按照题意,只要回到
void solve()
{
int n, x, k;cin >> n >> x >> k;
string s;cin >> s;
int ans = 0;
int cnt = 0;
bool ck = false;
if(x == 0)ck = true;
if(x != 0) {
for(auto &i : s) {
cnt ++;
if(i == 'L') {
x --;
} else {
x ++;
}
if(x == 0) {
ans ++;
k -= cnt;
ck = true;
break;
}
}
}
if(!ck) {
cout << 0 << '\n';
return;
}
cnt = 0;
ck = false;
for(auto &i : s) {
cnt ++;
if(i == 'L') {
x --;
} else {
x ++;
}
if(x == 0) {
ck = true;
break;
}
}
if(!ck) {
cout << ans << '\n';
} else {
ans += (k / cnt);
cout << ans << '\n';
}
}
C. Limited Repainting
赛时铸币卡了半个小时的一个题。
题目要我们求的是代价的最小值,而代价又是所有的不合法的点的最大值,那么这个题就是一个“找最大值的最小值”问题,考虑二分。
我们首先考虑两种颜色何时会被计入代价:
- 蓝色:没有被染色。
- 红色:被染成蓝色。
一开始就是红色,我们又何时需要去把他变成蓝色呢?如果一个蓝色的点,和另一个蓝色的点,合并染色,可以减少一次染色次数,并且其间红色的代价更低,那么此时把红色染成蓝色就更优。
也就是说,假设答案为 是满足的,那么大于 的也一定满足,因为如果 是满足的,那么此时错误颜色的最大值一定 ,那么对于所有大于 的,也可以用这种情况来满足,因此答案的可行性具有单调性,可以二分。
我们对答案进行二分,检查每一个二分到的值 是否合法,检查的时候,对于每一个大于 的蓝色块,优先考虑能否向前合并减少染色次数(前面有蓝色的块并且途中的红色块的值都小于这个 ,那就可行),不可行就增加染色次数,看最后染色次数是否超过 。
void init() {
for(int i = 1;i <= n;i ++) {
vis[i] = false;
}
}
bool check(int x) {
int cnt = 0;
int mx = 0;
bool ck = false;
for(int i = 1;i <= n;i ++) {
if(s[i] == 'R') {
mx = max(mx, a[i]);
} else if(a[i] > x){
if(!ck)cnt ++;
else if(mx > x)cnt ++;
mx = 0;
ck = true;
}
}
return cnt <= k;
}
void solve()
{
cin >> n >> k;
init();
cin >> s;
s = ' ' + s;
int mx = 0;
for(int i = 1;i <= n;i ++)cin >> a[i], mx = max(mx, a[i]);
int l = -1, r = mx + 1;
while(l + 1 != r) {
int mid = l + r >> 1;
if(check(mid))r = mid;
else l = mid;
}
cout << r << '\n';
}
D. Tree Jumps
讲真我个人觉得 D 比 C 简单多了,当然也可能是我 C 实在是太蠢了。
D 题是一棵有根树,除了第二层的结点只能连接根外,每个结点都可以连接非父结点构成一个合法序列,问有多少种合法序列。
那这不就很明显的一个 BFS 序嘛,然后按 BFS 序进行 DP。
记
void dfs(int st) { //其实这个dfs完全没必要,直接bfs求就行,实时求一下每个结点的层数
for(auto &i : g[st]) {
d[i] = d[st] + 1;
dfs(i);
}
}
void bfs(int st) {
queue<int> q;
q.push(st);
while(q.size()) {
int now = q.front();
q.pop();
for(auto &i : g[now]) {
int pre = ans[now];
int pred = ad[d[now]];
if(now == 1) {
ans[i] = pred % M;
} else {
ans[i] = (pred - pre) % M;
}
ad[d[i]] = (ans[i] + ad[d[i]]) % M;
q.push(i);
}
}
}
void init(int n) {
for(int i = 0;i <= n;i ++) {
g[i].clear();
ans[i] = 0;
ad[i] = 0;
}
}
void solve()
{
int n;cin >> n;
init(n);
for(int i = 2;i <= n;i ++) {
int x;cin >> x;
g[x].push_back(i);
}
d[1] = 0;
ans[1] = 1;
ad[0] = 1;
dfs(1);
bfs(1);
int res = 0;
for(int i = 1;i <= n;i ++) {
res = (res + ans[i]) % M;
}
cout << (res % M + M) % M << '\n';
}
作者: 天天超方的
出处: https://www.cnblogs.com/TianTianChaoFangDe
关于作者:ACMer,算法竞赛爱好者
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显醒目位置给出, 原文链接 如有问题, 可邮件(1005333612@qq.com)咨询.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架