首页 / 淘天笔试
#

淘天笔试

#
23189次浏览 250人互动
此刻你想和大家分享什么
热门 最新
03-08 16:59
已编辑
东北大学 Java
淘天笔试 第三题题解
#淘天笔试# #淘天# #笔试# 考虑换根DP,先随便找个点做根,每个点只统计这个有根树下它的子树对它的贡献,也就是if(color[u] != color[v]) color[u] += color[v];这样我们只能统计出子树的贡献,我们还需要父亲的贡献,父亲的贡献我们考虑扩展并查集,在dfs过程中顺便合并一下就能够得到每个点所在并查集的size,如果一个点和它的父亲不同颜色,那么就是相同并查集,直接用并查集size减去dp求出的子树贡献就是父亲的贡献,然后第二遍dfs,把每个点任意一种颜色都试一下,我们提前知道子树的贡献是多少,可以根据现在我们变的颜色统计一下现在的子树和,看看父亲跟他现在是不是一个颜色,是的话不加贡献,不然加上贡献,和ans取最大值即可。代码如下:#include# include#include# include#include# include#include# include#include# include#include# include#includeusing ll = long long;using ull = unsigned long long;const int maxn = 1e6 + 5;int fa[maxn],sum[maxn],siz[maxn];std::string color;char col[] = {'R','G','B'};int ans  = 0;int find(int x){    return x == fa[x] ? x : find(fa[x]);}void merge(int x,int y){    x = find(x), y = find(y);    if(x == y) return;    siz[x] += siz[y];    fa[y] = x;}std::vector g[maxn];void dfs(int u,int fa){    sum[u] = 1;    for(int i = 0;i < g[u].size();i++){        int v = g[u][i];        if(v == fa) continue;        dfs(v,u);        if(color[u] == color[v]){            sum[u] += sum[v];            merge(u,v);        }    }}void dfs2(int u,int fa){    int sfa = (find(u) == find(fa)) ? siz[find(u)] - sum[u] : siz[find(fa)];    for(int i = 0;i < 3;i++){        char c = col[i];        int s = 1;        for(auto& v : g[u]){            if(v == fa) continue;            if(c != color[v]) s += sum[v];        }        if(c != color[fa]) s += sfa;        ans = std::max(ans,s);    }    for(auto& v: g[u]){        if(v == fa) continue;        dfs2(v,u);    }}void solve(){    int n;    std::cin >> n;    std::cin >> color;    for(int i = 1;i <= n;i++){        siz[i] = 1;        fa[i] = i;    }    for(int i = 0;i < n - 1;i++){        int u,v;        std::cin >> u >> v;        g[u].push_back(v);        g[v].push_back(u);    }    dfs(1,0);    dfs2(1,0);    std::cout << ans << '\n';}int main() {    int T;    T = 1;    while(T--) solve();    return 0;}
投递淘天集团等公司10个岗位
点赞 评论 收藏
分享
03-15 20:26
已编辑
电子科技大学 C++
淘天3.15笔试
T3题面:给一个3e5数组,每次询问长度为len的子数组乘积的和,如果子数组乘积>1e9,则视为0.赛后一分钟想出来了,比赛时打了个暴力+线段树注意到1e9大约是2^30, 因此len长度如果>30就直接输出0,30以内做一个记忆化就行,复杂度O(30*n)感觉是以前比赛做过的题,忘了怎么做了。。。---upd: 忘了数据范围了,如果有0,1的话那这样也不行
blueswiller:给出一个做法,刚刚才想到,应该没问题,时间复杂度为 O(max(30n, nlogn)): 1. 根据 0 切分数组。2. 现在问题转化为>=1 的情况,我们首先维护每一个数前一个 > 1 的数的位置,同时维护一个长度的差分数组,初始值全为 0。3. 我们从每一个数 i 开始向前跳,至多跳 30 次,维护这个过程中的乘积,于是得到 30 个区间加和。举例:假设从 j1 跳到 j2 ,相当于对查询长度 (i- j1 + 1) 至 (i - j2) 贡献 a_i * ... * a_j1。4. 对于所有区间加和,我们采用差分数组结合树状数组对其进行维护,由于长度至多为 n ,树状数组构建的复杂度为 O(nlogn),于是,构建阶段的复杂度为 O(max(30n, nlogn))。在线单次查询的复杂度为树状数组查询的复杂度 O(logn)。
投递淘天集团等公司10个岗位 >
点赞 评论 收藏
分享
2024-09-11 21:02
门头沟学院 Java
9月11日阿里淘天笔试
里面好多套题,Java,Android,IOS前端都有,任选其一。时间只有100分钟,量大题难,不愧是阿里。总共15道单选,5道多选,3道编程。选择题类型还是数据结构,Linux,数据库,设计模式,计算机网络,以及编程语言,有的不确定的也跳了,怕后面时间来不及。编程题,难度大概是middle middle+ hard,最后一题是真的有点难,耽误了很久。第一题计算异或结果,核心在于找到两个字符串中长度最大的,利用StringBuilder构建即可,在最后比较的时候,从后往前比较,相同补0,不同补1。第二题,小有难度,找数类的题,需要注意的点是,构建二进制数,模拟二进制加法,删除多余的0以及边界特殊条件(我也没处理好)。最后过了90%,怕时间不够,继续做了。最后时间也不多了,也没改进成,感觉是数据范围问题。第三题,难度更高,光读题都好久,好在前两天笔试遇到过类似的,思路有一点点像,当时没写出来,后面复盘的时候看博主解析,知道思路了。所以这次在理解题意上快了很多。这题要不是遇到过类似的,我肯定想不到,用到了快速幂和逆元,都是ACM里的概念,平时leetcode不咋遇到过。剩下需要注意的就是,分类讨论,从0-5一次分解问题,最后debug一会ac。时间所剩无几。总的来说,不愧是阿里,量大题难,感觉得给两个小时才算正常,100分钟真的太赶了。另外也感受到笔试复盘的意义,不会的题,下去再看看别人的解法和解析,不一定啥时候又碰到了。 #阿里求职进展汇总# #淘天笔试#
查看3道真题和解析 投递阿里巴巴集团等公司10个岗位
点赞 评论 收藏
分享
2024-04-03 20:52
电子科技大学 后端
淘天0403笔试
SPA_KJ:第二题我用的是贪心,就是把和第一个字母不同的放到数组里,如果最后一个和第一个不同,就是1,其他就是这个数组的间隔最小+2,当然头部和尾部要稍微考虑一下,头部就是a[0] ,尾部就是n-a[a.size()-1)+1个
投递淘天集团等公司10个岗位
点赞 评论 收藏
分享
玩命加载中
牛客网
牛客企业服务