网易4.21普通技术笔试T3T4

#include<bits/stdc++.h>
using namespace std;
long long dp[100005][5];
int vis[100005];
struct node
{
    int x;
    int y;
    int z;
};
vector<node>q[100005];
void spfa(int x)
{
    queue<int>nh;
    nh.push(x);
    vis[x]=1;
    while(!nh.empty())
    {
        int now=nh.front();
        nh.pop();
        vis[now]=0;
        int len=q[now].size();
        for(int i=0; i<len; i++)
        {
            if(q[now][i].z==0)
            {
                int to=q[now][i].x;
                int val=q[now][i].y;
                if(dp[to][0]>dp[now][0]+val)
                {
                    dp[to][0]=dp[now][0]+val;
                    if(vis[to]=1)
                    {
                        nh.push(to);
                        vis[to]=1;
                    }
                }
                if(dp[to][1]>dp[now][1]+val)
                {
                    dp[to][1]=dp[now][1]+val;
                    if(vis[to]=1)
                    {
                        nh.push(to);
                        vis[to]=1;
                    }
                }
            }
            else
            {
                int to=q[now][i].x;
                int val=q[now][i].y;
                if(dp[to][1]>dp[now][0]+val)
                {
                    dp[to][1]=dp[now][0]+val;
                    if(vis[to]=1)
                    {
                        nh.push(to);
                        vis[to]=1;
                    }
                }
            }
        }
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        q[x].push_back({y,z,0});
        q[y].push_back({x,z,1});
    }
    for(int i=2; i<=n; i++)
    {
        dp[i][1]=1e18;
        dp[i][0]=1e18;
    }
    spfa(1);
    if(min(dp[n][0],dp[n][1])==1e18) printf("-1\n");
    else printf("%lld\n",min(dp[n][0],dp[n][1]));
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
int n,m,h;
int solve(int x,int y,int z)
{
    return (n*m)*(z-1)+(x-1)*m+y;
}
bool check(int x,int y,int z)
{
    if(x<=0||x>n) return 0;
    if(y<=0||y>m) return 0;
    if(z<=0||z>h) return 0;
    return 1;
}
int a[200005];
int now;
int fa[200005];
int nh[200005];
int modify[200005][5];
int vis[200005];
int dir[6][3]= {1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
void dfs(int x,int y,int z,int num)
{
    vis[solve(x,y,z)]=1;
    fa[solve(x,y,z)]=num;
    for(int i=0; i<6; i++)
    {
        int xx=x+dir[i][0];
        int yy=y+dir[i][1];
        int zz=z+dir[i][2];
        if(check(xx,yy,zz)&&vis[solve(xx,yy,zz)]==0&&a[solve(xx,yy,zz)]==0)
        {
            dfs(xx,yy,zz,num);
        }
    }
    return ;
}
int f(int x)
{
    while(fa[x]!=x)
    {
        x=fa[x]=fa[fa[x]];
    }
    return x;
}
int main()
{
    scanf("%d%d%d",&n,&m,&h);
    for(int i=1; i<=n*m*h; i++)
    {
        fa[i]=i;
    }
    int k;
    scanf("%d",&k);
    for(int i=1; i<=k; i++)
    {
        scanf("%d%d%d",&modify[i][1],&modify[i][2],&modify[i][3]);
        if(a[solve(modify[i][1],modify[i][2],modify[i][3])]==1)
        {
            nh[i]=1;
        }
        a[solve(modify[i][1],modify[i][2],modify[i][3])]=1;
    }
    vector<int>ans;
    now=0;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            for(int k=1; k<=h; k++)
            {
                if(vis[solve(i,j,k)]==0&&a[solve(i,j,k)]==0)
                {
                    dfs(i,j,k,solve(i,j,k));
                    now++;
                }
            }
        }
    }
    ans.push_back(now);
    for(int i=k; i>=2; i--)
    {
        if(nh[i]==1)
        {
            ans.push_back(now);
        }
        else
        {
            //printf("*********");
            a[solve(modify[i][1],modify[i][2],modify[i][3])]=0;
            vector<int>bza;
            for(int j=0; j<6; j++)
            {
                int xx=modify[i][1]+dir[j][0];
                int yy=modify[i][2]+dir[j][1];
                int zz=modify[i][3]+dir[j][2];
                if(check(xx,yy,zz)&&a[solve(xx,yy,zz)]==0)
                {
                    bza.push_back(f(solve(xx,yy,zz)));
                }
            }
            int len=bza.size();
            if(len==0) now++,fa[solve(modify[i][1],modify[i][2],modify[i][3])]=solve(modify[i][1],modify[i][2],modify[i][3]);
            else
            {
                map<int,int>q;
                for(int j=1; j<len; j++)
                {
                    if(q[bza[j]]==0&&bza[j]!=bza[0])
                    {
                        now--;
                        fa[bza[j]]=fa[bza[0]];
                        q[bza[j]]=1;
                    }
                }
                fa[solve(modify[i][1],modify[i][2],modify[i][3])]=bza[0];
            }
            ans.push_back(now);
        }
    }
    int len=ans.size();
    for(int i=len-1; i>=0; i--)
    {
        printf("%d\n",ans[i]);
    }
    return 0;
}

#网易##笔试题目#
全部评论
有兄弟贴下第三题题目吗?当时想到是Dij算法,但是Dij有点忘了就没做,去干第四题了,虽然也没干出来。现在想做做~感谢!
2 回复 分享
发布于 2022-04-22 11:13
第三题,我每次把一条有向边变为无向边,再用dijikstra求,只过了20
1 回复 分享
发布于 2022-04-21 21:44
换数字那道题有好的方法吗,暴力解40%
点赞 回复 分享
发布于 2022-04-21 21:09
学习了!感谢大佬
点赞 回复 分享
发布于 2022-04-22 13:10
您好,题目可以说下吗?源点和目标点是哪个,不太记得了
点赞 回复 分享
发布于 2022-04-22 11:09
兄弟这个if(vis[to]=1)是啥?应该是!=?
点赞 回复 分享
发布于 2022-04-22 08:54
你这spfa怎么是 if(vis[to]=1)?
点赞 回复 分享
发布于 2022-04-21 22:30
分享一下T2: long[] data, n, p, x long count = 0; long sum = 0; for (long num: data){       sum+=num; } for ( int i = 0; i < data.length; i++){       long othersSum = sum - data[i];       long a = otherSum % x;       long b = (x - a) % x;       count += (p + a) / x;        if (data[i] % x == b && data[i] <= p){              count--;    //不能包含原数字       } } return count;
点赞 回复 分享
发布于 2022-04-21 22:27
大佬可以简单介绍一下思路吗?太菜了,有点看不懂,感谢感谢~~
点赞 回复 分享
发布于 2022-04-21 21:22
第三题我直接从1开始dijistra,再反向建边从n开始dijistra,枚举每条边,没毛病呀,怎么就过20%
点赞 回复 分享
发布于 2022-04-21 21:17
可以讲下第四题思路吗
点赞 回复 分享
发布于 2022-04-21 21:15
大佬太强了
点赞 回复 分享
发布于 2022-04-21 21:04

相关推荐

東大沒有派對:这是好事啊(峰哥脸
我的秋招日记
点赞 评论 收藏
分享
从大一开始就开始学习Java,一路走来真的不算容易,每次面试都被压力,不过这次终于达成了自己的一大心愿!时间线和面经:8.17-投递9.1-一面实习+项目拷打看门狗机制讲一下redis加锁解锁的本身操作是什么Lua脚本是干什么的udp和tcp讲一下流量控制讲一下令牌桶算法说一下大端和小端是什么线程和协程有什么区别怎么切换协程切换的时候具体做了什么对于程序来说,你刚才提到的保存和恢复现场,这个现场有哪些信息udp优势现在有一个客户端和服务端,要实现TCP的通信,我们的代码要怎么写服务器怎么感知有新的连接怎么处理多个客户端的请求连接TCP怎么处理粘包和分包现在有两个文件,然后每个文件都有一亿条URL,每个的长度都很长,要怎么快速查找这两个文件共有的URLHashmap底层说一下怎么尽量提升插入和查询的效率如果要查找快,查询快,还有解决非空的问题,怎么做LoadingCache了解吗手撕:堆排序9.4-二面部门的leader,超级压力面拷打实习+项目,被喷完全没东西类的加载到垃圾回收整个底层原理讲一遍类加载谁来执行类加载器是什么东西,和进程的关系Java虚拟机是什么东西,和进程的关系如果我们要执行hello&nbsp;world,那虚拟机干了什么呢谁把字节码翻译成机器码,操作时机是什么Java虚拟机是一个执行单元吗Java虚拟机和操作系统的关系到底什么,假如我是个完全不懂技术的人,举例说明让我明白一个操作系统有两个Java程序的话,有几个虚拟机有没有单独的JVM进程存在启动一个hello&nbsp;world编译的时候,有几个进程JVM什么时候启动比如执行一条Java命令的时候对应一个进程,然后这个JVM虚拟机到底是不是在这个进程里面,还是说要先启动一个JVM虚拟机的进程垃圾回收机制的时机能手动触发垃圾回收吗垃圾回收会抢占业务代码的CPU吗垃圾回收算法简单说说垃圾回收机制的stop&nbsp;the&nbsp;world存在于哪些时机垃圾回收中的计算Region的时候怎么和业务代码并行执行假如只有一个线程,怎么实现并行Java为什么要这么实现Java效率比C++慢很多,那为什么还要这样实现Java虚拟机到底是什么形式存在的说一下Java和C++的区别还有你对Java设计理念的理解无手撕面试结束的时候,我真的汗流浃背了,面试官还和我道歉,说他是故意压力面想看看我的反应的,还对我给予了高度评价:我当面试官这么多年,你是我见过最好的一个9.9-三面临时通知的加面,就问了三十分钟项目9.11-hr面问过往经历,未来计划,想从腾讯实习中得到什么?当场告知leader十分满意我,所以直接ochr面完一分钟官网流程变成录用评估中,30分钟后mt加微信告知offer正在审批9.15-offer这一次腾讯面试体验真的不错,每个面试官能感觉到专业能力很强,反馈很足,比起隔壁某节真是好太多以后就是鹅孝子了
三本咋了:当面试官这么多年你是我见过的最好的一个
你面试被问到过哪些不会的...
点赞 评论 收藏
分享
评论
7
18
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务