avatar-decorate
给个off吧要我做什么都行 level
获赞
116
粉丝
92
关注
10
看过 TA
1962
华中科技大学
2026
Java
IP属地:湖北
暂未填写个人简介
私信
关注
0 点赞 评论 收藏
分享
头像
03-09 21:01
已编辑
华中科技大学 Java
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;        }    }#笔试# #蚂蚁# #蚂蚁笔试#
投递蚂蚁集团等公司10个岗位 笔试
0 点赞 评论 收藏
分享
头像
03-07 20:59
已编辑
华中科技大学 Java
1,第一题,可以发现每个数只有与不一样的数交换才有贡献,比第i位为1,i < j,只有s[j]为0才可以交换,统计一下前/后缀0/1的个数就可以了,然后加一下贡献```#include <iostream>#include <vector>using namespace std;int main() {    string s;    while (cin >> s) {        long long res = 1;        vector<int> a0(s.size() + 1, 0), a1(s.size() + 1, 0);        for (int i = s.size() - 1; i >= 0; i --) {            if (s[i] == '0') {                a0[i] = a0[i + 1] + 1;                a1[i] = a1[i + 1];                res += 1ll * a1[i];            } else {                a0[i] = a0[i + 1];                a1[i] = a1[i + 1] + 1;                res += 1ll * a0[i];            }        }        cout << res << '\n';    }}// 64 位输出请用 printf("%lld")```2,可以hash一下每个图,每一行有多少个?每一行的值就是多少,11111代表五行每行都只有一个问号,后面就容易不少了。#include <iostream>#include <string>using namespace std;int main() {    int n;    cin >> n;    while (n --) {        string map[6];        int hash = 0;        for (int i = 0; i < 5; i ++) {            cin >> map[i];            int count = 0;            for (int j = 0; j < 5; j ++) {                if (map[i][j] != '#') count ++;            }            hash = hash * 10 + count;         }        // cout << "hash:" << hash <<'\n';        if (hash == 32223) {            cout <<0;        } else if (hash == 11111) {            cout << 1;        } else if (hash == 22311) {            cout << 4;        } else if (hash == 31111) {            cout << 7;        } else if (hash == 31323) {            cout << 6;        } else if (hash == 32323) {            cout << 8;        } else if (hash == 32313) {            cout << 9;        } else {            if (map[1][3] != '#') {                if (map[3][1] != '#') cout << 2;                else cout << 3;            } else {                cout << 5;            }        }    }    }// 64 位输出请用 printf("%lld")3,字典树比较模板的题,可以学一下字典树怎么写的,然后在字典树路径下贪心找最优解#牛客AI配图神器# #include <iostream>using namespace std;const int N = 2e5 + 10;int tr[N * 60][2], cnt[N * 60][2], ind;void insert(int x, int mod) {    int p = 0;    for (int i = 31; i >= 0; i--) {        int v = x >> i & 1;        if (tr[p][v] == 0) tr[p][v] = ++ind;        cnt[p][v] += mod;        p = tr[p][v];    }}int getMaxXor(int x) {    int res = 0, p = 0;    for (int i = 31; i >= 0 ; i --) {        int v = x >> i & 1;        if (cnt[p][!v]) {            p = tr[p][!v];            res += 1 << i;        } else {            p = tr[p][v];        }    }    return res;}signed main() {    int n;    cin >> n;    int cnt = 0;    while (n --) {        int a, b;        cin >> a >> b;        if (a == 1) {            cnt ++;            insert(b, 1);        } else if (a == 2) {            cnt --;            insert(b, -1);        } else {            if (cnt == 0)             cout << -1 << '\n';            else cout << getMaxXor(b) << '\n';        }    }}// 64 位输出请用 printf("%lld")
在西伯利亚种土豆:这第二题直接暴力if else结果出bug了,调了半小时眼睛都快瞎了。还是大佬这方法简单
投递饿了么等公司10个岗位
0 点赞 评论 收藏
分享
头像
03-04 18:20
已编辑
华中科技大学 Java
一面:2月24 1h八股:15min1,问tcpudp的区别?2,什么协议用tcp,什么用udp3,mysql的索引结构4,b+树有什么优点5,linux内存模型,malloc做了什么,堆区栈区的作用聊实习: 20min算法:不重复的全排列二面:3月3日聊实习:20min三道场景题:1,设计一个贴吧系统,某个贴吧做活动,发帖量很高怎么做答:同步处理请求,异步落地,同步缓存发帖信息,异步mq落地。2,如果某个贴吧发帖量相当高,二级消费者消费不过来阻塞其他用户发帖怎么办。答:topic分区,物理隔离各个贴吧。贴吧单点限流(被否定了,因为用户体验差)。然后针对消息堆积的问题,改二级消费者的事件驱动型消费为批处理消费,一次消费多条数据增加mysql吞吐量,同时动态扩容消费者。这题pass了3,设计一个wx朋友圈,你能看到你朋友发的所有pyq,按照时间排序。答:一开始撤了半天非关系型数据库,图关系数据库,没扯到点子上。最后想了一会答的是,每个用户维护一个zset,保存好友的pyq内容和时间戳,同时动态维护这个zset,每个人发pyq的时候维护他的所有好友的zset。4,又问了,如果一个人朋友非常多怎么办,你一次更新相当多的zset如何保证全部更新成功或者更新失败。答:用户发pyq的时候不更新redis,只落地,同时发送异步消息更新redis,依赖mq的重试机制。5,如何做幂等?答:zset的天然幂等,一开始答的分为process/done阶段,答完之后感觉不对想起来zset是天然幂等的6,如果是微博哪种朋友圈,有很多大v怎么办,他们发消息也会异步更新所有关注他的人吗。答:异步更新 + 主动拉取配合。对于大v粉丝量很高就不异步更新redis了,发pyq的时候主动缓存到redis,用户刷pyq的时候维护一个大v的keyset,用户的zset和keyset做一下归并。这个问题我觉得答的不好,虽然好像效率还可以但是redis内存爆炸,而且zset缓存条数有限,如果用户把zset刷完了如何高效pull数据没想到,不过也没问。闲聊:为什么评测做的很快,是不是瞎写的:答:有点汗流浃背了,确实是瞎写的ds有哪些应用。你的优缺点#牛客AI配图神器# 3.4日 挂#面经# #腾讯# #pcg#
牛客647395439号:怎么二面咱俩的题几乎一样 我也挂了
查看15道真题和解析
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客企业服务