Educational Codeforces Round 161 (Rated for Div. 2)

1|0基本情况

A犯病卡半小时。

主要就是太着急,题目没有彻底分析清楚就开始想一些错误做法。

C最优想法出来的慢。

E比较好想。

2|0C. Closest Cities

Problem - C - Codeforces

就,显然是能走最近城市就走,不行就不走。

一开始弄了一个自作聪明的预处理,但实际上每次查询还是 O(n) 的复杂度,T 了第二个点。

void solve() { int n; cin >> n; vector<int> a(n + 1); vector<bool> tag(n + 1); vector<int> ind1, ind2; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) { if (a[i + 1] - a[i] < a[i] - a[i - 1]) { tag[i] = true; ind1.emplace_back(i); } else { tag[i] = false; ind2.emplace_back(i); } } int q; cin >> q; int x, y; while(q--) { cin >> x >> y; ll sum = 0; if (x <= y) { if (x == 1) { x++, sum++; } auto p = lower_bound(ind1.begin(), ind1.end(), x); for (int i = x; i < y; i++) { if (tag[i]) { sum++; p++; } else { if (p == ind1.end()) { sum += a[y] - a[i]; break; } int temp = *p; if (temp > y) { sum += a[y] - a[i]; break; } else { sum += a[temp] - a[i]; i = temp; } } } } else { if (x == n) { x--, sum++; } auto p = lower_bound(ind2.begin(), ind2.end(), x); if (p != ind2.begin() && *p != x) p--; for (int i = x; i > y; i--) { if (!tag[i]) { sum++; p--; } else { if (p == ind2.begin()) { sum += a[i] - a[y]; break; } if (*p < y) { sum += a[i] - a[y]; break; } else { sum += a[i] - a[*p]; i = *p; } } } } cout << sum << endl; } }

但这题显然可以把所有距离的答案都预处理掉,查询的时候直接类似前缀和 O(1)

void solve() { int n; cin >> n; vector<int> a(n + 1); vector<int> ind1(n + 1), ind2(n + 1); for (int i = 1; i <= n; i++) cin >> a[i]; ind1[1] = 0; ind1[2] = ind1[1] + 1; for (int i = 3; i <= n; i++) { if (a[i - 1] - a[i - 2] > a[i] - a[i - 1]) { ind1[i] = ind1[i - 1] + 1; } else { ind1[i] = ind1[i - 1] + a[i] - a[i - 1]; } } ind2[n] = 0; ind2[n - 1] = ind2[n] + 1; for (int i = n - 2; i >= 1; i--) { if (a[i + 2] - a[i + 1] > a[i + 1] - a[i]) { ind2[i] = ind2[i + 1] + 1; } else { ind2[i] = ind2[i + 1] + a[i + 1] - a[i]; } } int q; cin >> q; int x, y; while(q--) { cin >> x >> y; if (x <= y) { cout << ind1[y] - ind1[x] << endl; } else { cout << ind2[y] - ind2[x] << endl; } } }

这题 +3,应该在第一次 T 了之后就重写做法了,但是还想着在原来那个方法上面优化,导致疯狂罚时。


__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17976161.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示