首页 / 蚂蚁笔试
#

蚂蚁笔试

#
42833次浏览 313人互动
此刻你想和大家分享什么
热门 最新
头像
03-09 21:01
已编辑
华中科技大学 Java
蚂蚁笔试题解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;}}
投递蚂蚁集团等公司7个岗位
点赞 评论 收藏
分享
蚂蚁0313笔试统计
投票
投递蚂蚁集团等公司7个岗位
点赞 评论 收藏
分享
玩命加载中
牛客网
牛客网在线编程
牛客网题解
牛客企业服务