蚂蚁笔试题解0309
1,模拟一下就好,别忘了处理换行和回车,代码略。
2,bfs一下,找出每个点的坐标,o1输出就可以了。
void bfs(int u) {
queue q;
q.push(u);
pos[u] = {0, 0};
mark[u] = 1;
while (q.size() > 0) {
int v = q.front();
q.pop();
int l = - 1, r = -1;
for (auto x : g[v]) {
if (mark[x]) continue;
mark[x] = 1;
q.push(x);
if (l == -1) l = x;
else {
r = x;
if (l > r) swap(l, r);
}
}
if (l != -1) {
pos[l] = pair(pos[v].x - 1, pos[v].y - 1);
}
if (r != -1) {
pos[r] = pair(pos[v].x + 1, pos[v].y - 1);
}
}
}
3,可以发现,我们要计算的是每个数整除其他数之后的和。其实可以反过来想,我们要计算每个数作为除数,其他数除他之后的和。对于数i来说,[j * i, j * i + i - 1]这个范围内的数除以i等于j,那我们可以枚举每个i和每个j,维护一个前缀和来快速算出[j * i, j * i + i - 1]这个范围内的贡献,贡献数是i的数量 * 范围内数的个数 * j。
时间复杂度是n + n/2 + n /3 +... = nlogn
代码如下,cnt[i]是数字i的数量,sum[i]是前cnt[i]的前缀和,N是数的最大范围1e5;
for (int i = 1; i < N; i ++) {
if (cnt[i] == 0) continue;
for (int j = 1; j * i < N; j ++) {
res += 1ll * (sum[min(i * j + i - 1, N - 1)] - sum[i * j - 1]) * cnt[i] * j;
}
}
#笔试# #蚂蚁# #蚂蚁笔试#
2,bfs一下,找出每个点的坐标,o1输出就可以了。
void bfs(int u) {
queue q;
q.push(u);
pos[u] = {0, 0};
mark[u] = 1;
while (q.size() > 0) {
int v = q.front();
q.pop();
int l = - 1, r = -1;
for (auto x : g[v]) {
if (mark[x]) continue;
mark[x] = 1;
q.push(x);
if (l == -1) l = x;
else {
r = x;
if (l > r) swap(l, r);
}
}
if (l != -1) {
pos[l] = pair(pos[v].x - 1, pos[v].y - 1);
}
if (r != -1) {
pos[r] = pair(pos[v].x + 1, pos[v].y - 1);
}
}
}
3,可以发现,我们要计算的是每个数整除其他数之后的和。其实可以反过来想,我们要计算每个数作为除数,其他数除他之后的和。对于数i来说,[j * i, j * i + i - 1]这个范围内的数除以i等于j,那我们可以枚举每个i和每个j,维护一个前缀和来快速算出[j * i, j * i + i - 1]这个范围内的贡献,贡献数是i的数量 * 范围内数的个数 * j。
时间复杂度是n + n/2 + n /3 +... = nlogn
代码如下,cnt[i]是数字i的数量,sum[i]是前cnt[i]的前缀和,N是数的最大范围1e5;
for (int i = 1; i < N; i ++) {
if (cnt[i] == 0) continue;
for (int j = 1; j * i < N; j ++) {
res += 1ll * (sum[min(i * j + i - 1, N - 1)] - sum[i * j - 1]) * cnt[i] * j;
}
}
#笔试# #蚂蚁# #蚂蚁笔试#
全部评论
佬,真的佬,是 acmer 吗
相关推荐
点赞 评论 收藏
分享
2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用
2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的
3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单
4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价 点赞 评论 收藏
分享
查看23道真题和解析