AtCoder Beginner Contest 170 (D~F题,D筛法,E multiset使用,F Dijkstra算法改进)
题目链接:Here
ABC水题,
D. Not Divisible
看了题解才想到,可以用 Sieve of Eratosthenes,因为 \(A_i\) 最大才 \(10^6\)
但有注意的点
1
1
5
2 2 2 3 3
5
2 2 2 4 4
5
1 1 1 1 2
重复出现的数字
简单的说:找出数列中不是其他数的倍数的数的个数(拗口)。用小数筛大数。
const int N = 1e6 + 10;
int a[N], cnt[N];
bool st[N];
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n; cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i], cnt[a[i]] += 1;
for (int i = 1; i <= N; ++i) {
if (cnt[i]) {
if (cnt[i] > 1) st[i] = 1; // 对于重复出现的数据也要标记
for (int j = i + i; j <= N; j += i) st[j] = 1;
}
}
int ans = 0;
for (int i = 1; i <= n; ++i) ans += !st[a[i]];
cout << ans;
}
E. Smart Infants
照着题目模拟就是,问题主要是要用对资料结构。 对于每个 kindergarden 我们需要一个可以高速插入、高速删除、高速查询最大值的容器。
C++ 的 multiset 符合所需。 使用 c++ 的 multiset 要注意的一点是 set.erase(val) 会删除容器中所有值为 val 的 entries,若只想删除一个值为val 的 entry,要用 set.erase(set.find(val))。
即:对每次变换求所有集合最大值中的最小值。用s[]表示各个集合,m表示最大值集合,每次对集合元素删除加入。注意元素有可能相同,所以要用multiset.
int main() { // try new nameing rules and Coding style
cin.tie(nullptr)->sync_with_stdio(false);
int N, Q;
int M = 2e5;
cin >> N >> Q;
auto belong = vector<int>(N, -1);
auto rating = vector<int>(N, -1);
auto evenesses = multiset<int>();
auto kdrgrtns = vector<multiset<int>>(M);
for (int i = 0; i < N; ++i) {
int A, B;
cin >> A >> B;
B--;
rating[i] = A;
belong[i] = B;
kdrgrtns[B].insert(A);
}
for (auto k : kdrgrtns) {
if (!k.empty())
evenesses.insert(*k.rbegin());
}
while (Q--) {
int C, D;
cin >> C >> D;
C--, D--;
auto &kdrgrtn_src = kdrgrtns[belong[C]];
auto &kdrgrtn_dst = kdrgrtns[D];
evenesses.erase(evenesses.find(*kdrgrtn_src.rbegin()));
kdrgrtn_src.erase(kdrgrtn_src.find(rating[C]));
if (kdrgrtn_src.size() > 0)
evenesses.insert(*kdrgrtn_src.rbegin());
if (kdrgrtn_dst.size() > 0)
evenesses.erase(evenesses.find(*kdrgrtn_dst.rbegin()));
kdrgrtn_dst.insert(rating[C]);
evenesses.insert(*kdrgrtn_dst.rbegin());
belong[C] = D;
cout << *evenesses.begin() << "\n";
}
}
F. Pond Skater
Snuke,水上平衡车,住在一个矩形池塘,可以看成 H 列 W 行,(i, j) 表示第 i 列第 j 行。池塘里长着荷叶,荷叶是不能进入的。如果 cij 是 @,表示荷叶。如果 cij 是 .,表示不是荷叶。
Snuke 每次可以向北、东、南、西的任意同一个方向移动一步到 K 步,但是不能通过荷叶,同时也不能移动到池塘外。
给我们起点坐标 (x1, y1) 和终点坐标 (x2, y2),要求我们找到最小的移动步数。如果不能到达,输出 -1。
Here 有一个博主写了很详细的分析
这题马上让人想到是最短路径,于是就刻了一个 Dijkstra,然后就会 TLE。
对于每个 vertex 我们都展开 4 * K 条边实在太多了,所幸我们可以剪枝。
当我们在 (r, c),尝试用 dis[r][c] + 1 松弛 dis[r + k * dr][c + k * dc] 不成功时,我们不需要展开更大的 k,因为那些更远的点(即 k 更大)不可能透过目前的路径得到更佳的解。
写成程式码就是在展开边的地方加入剪枝:
// omit
for (int k = 1; k <= K; k++) {
// omit
if (dis[r + k * dr][c + k * dc] < dis[r][c] + 1) break;
// omit
}
你就能 AC 了。官方題解我是沒有看懂,這題網路上的題解都是 BFS + 剪枝,我是覺得挺神奇的啦,最短路徑不是應該想到 Dijkstra 嗎?還有人說此剪枝方法不適用 Dijkstra,只能用在 BFS 上 (┛ಠ_ಠ)┛彡┻━┻
using ti3 = tuple<int, int, int>;
const int inf = 0x3f3f3f3f;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int H, W, K;
cin >> H >> W >> K;
int sr, sc, tr, tc;
cin >> sr >> sc >> tr >> tc;
sr--, sc--, tr--, tc--;
vector<string> S(H);
for (int i = 0; i < H; ++i) cin >> S[i];
vector<ti3> nxt;
nxt.push_back({+1, 0, 1});
nxt.push_back({-1, 0, 1});
nxt.push_back({0, +1, 1});
nxt.push_back({0, -1, 1});
vector<vector<int>> dis(H, vector<int>(W, inf));
auto q = priority_queue<ti3, vector<ti3>, greater<ti3>>();
dis[sr][sc] = 0;
q.push({0, sr, sc});
while (!q.empty()) {
auto [d, r, c] = q.top(); q.pop();
if (d > dis[r][c]) continue;
for (auto &&[dr, dc, w] : nxt) {
for (int k = 1; k <= K; ++k) {
int nr = r + k * dr;
int nc = c + k * dc;
if (nr < 0 || nr >= H) break;
if (nc < 0 || nc >= W) break;
if (S[nr][nc] == '@') break;
if (dis[nr][nc] < d + w) break;
if (dis[nr][nc] > d + w) {
dis[nr][nc] = d + w;
q.push({dis[nr][nc], nr, nc});
}
}
}
}
cout << (dis[tr][tc] == inf ? -1 : dis[tr][tc]);
}
AtCoder Beginner Contest 170 (D~F题,D筛法,E multiset使用,F Dijkstra算法改进)的更多相关文章
- AtCoder Beginner Contest 170
比赛链接:https://atcoder.jp/contests/abc170 A - Five Variables 题意 $5$ 个数中有 $1$ 个 $0$,判断是第几个. 代码 #include ...
- AtCoder Beginner Contest 142【D题】【判断素数的模板+求一个数的因子的模板】
D - Disjoint Set of Common Divisors Problem Statement Given are positive integers AA and BB. Let us ...
- AtCoder Beginner Contest 170 D - Not Divisible (数学)
题意:有一长度为\(n\)的数组,求该数组中有多少元素不能整除其它任一元素的个数. 题解:刚开始写了个分解质因数(我是傻逼),后来发现直接暴力枚举因子即可,注意某个元素出现多次时肯定不满足情况,再特判 ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 068 ABCD题
A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ...
- AtCoder Beginner Contest 238 A - F 题解
AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 075 C bridge【图论求桥】
AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...
随机推荐
- 🔥🔥Java开发者的Python快速进修指南:面向对象--高级篇
首先,让我来介绍一下今天的主题.今天我们将讨论封装.反射以及单例模式.除此之外,我们不再深入其他内容.关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符.而对于反 ...
- CentOS 7替换默认软件源
安装CentOS 7后,默认源在国外,可以替换为国内的源以提升访问速度 参考https://mirrors.ustc.edu.cn/help/centos.html sudo vi /etc/yum. ...
- 大白话说Python+Flask入门(六)Flask SQLAlchemy操作mysql数据库
写在前面 这篇文章被搁置真的太久了,不知不觉拖到了周三了,当然,也算跟falsk系列说再见的时候,真没什么好神秘的,就是个数据库操作,就大家都知道的CRUD吧. Flask SQLAlchemy的使用 ...
- 探秘C#中的秘密通道:五种引人注目的方法调用内部或私有方法
在 C# 中,可以使用不同的方法调用内部或私有方法.下面分别介绍通过反射.MethodInfo.CreateDelegate.表达式(树).动态方法(call).动态方法(calli)这五种方法. 1 ...
- 流畅的orm让我发现我抵触的是mybatis而不是java
流畅的orm让我发现我抵触的是mybatis而不是java 背景介绍 开发.net 也快10年了,到第三年的时候我已经渐渐瓶颈了,于是我在网上找各种资料但是大部分c#资料全是皮毛资料,稍微深一点点就再 ...
- C++ Qt 开发:ListWidget列表框组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ListWid ...
- django自带的cache缓存框架使用
https://docs.djangoproject.com/zh-hans/4.2/topics/cache/#top 主要步骤官网也写得很清楚了,包含怎么区使用. 这里就展示一些配置django- ...
- 【源码系列#04】Vue3侦听器原理(Watch)
专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核推荐 欢迎各位ITer关注点赞收藏 语法 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数 ...
- windows10更新文件存在哪里
windows10更新文件存在哪里windows10更新文件存在哪里 电脑系统每次更新都会有相应的更新文件,很多win10用户都想知道电脑更新文件存在哪里,其实这个很好找的. 你先双击此电脑进入,然后 ...
- 【笔记】Ribbon负载均衡伪随机算法
伪随机:思路 当一个下标(伪服务)连接被调用两次,第三次如果还是它,就让再随机一次 当重复随机到一台服务两次时判断第三次是否还是它 是的话 我们要进行 再次随机 也就是第三次 package top. ...