Cow Ski Area

Cow Ski Area

题目描述:

滑冰,给你一个地图,值代表高度,你只能从高到低滑,相同高度的点可以随便滑,除了根据势能来滑动,你还可以建造传送门,可以无视传送机起点到终点的高度随便走,即双向的,众所周知,传送门很贵,你现在想知道最少造几个传送门使得任意一个点都可以滑到全图所有点

思路:

Network of Schools差不多,这次只需要求出max(入度为0,出度为0)即可,仔细想一下,这个题真的需要建图吗?建图的意义是什么?在上一个题,建图的意义是使用tarjan缩点,但是这里给出了地图,相同高度的点可以随便到,就相当于一个点,这不就和缩点一样了嘛,那我们干嘛还建图跑tarjan,直接跑dfs即可,跑完了以后就可以去搞出度入度,开俩数组就解决

这里本来是需要vis数组的,但是我发现用color记录颜色的时候就可以起到vis的作用,所以我就没开(能省一点是一点

坑点:

  • Network of Schools的坑点一样,直接就是一个强连通图的话直接输出0
  • 最后统计出度入度的时候,判断u到v必须是tr[u] > tr[v],不能有等于号,因为写了等于号在一些时候就会自己连自己,形成自环,这样in和out都变了,会wa
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<string>
#include<vector>
#include<sstream>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1.0E-8
#define endl '\n'
//#define inf 0x3f3f3f3f
#define MAX  2000000 + 50
//#define mod 1000000007
#define lowbit(x) (x & (-x))
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d %d",&n,&m)
#define pd(n) printf("%d\n", (n))
#define pdd(n,m) printf("%d %d\n",n, m)
#define sddd(n,m,z) scanf("%d %d %d",&n,&m,&z)
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define mem(a,b) memset((a),(b),sizeof(a))
#define max(a,b) (((a)>(b)) ? (a):(b))
#define min(a,b) (((a)>(b)) ? (b):(a))
typedef  long long ll ;
typedef unsigned long long ull;
//不开longlong见祖宗!不看范围见祖宗!
inline int IntRead(){char ch = getchar();int s = 0, w = 1;while(ch < '0' || ch > '9'){if(ch == '-') w = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0';ch = getchar();}return s * w;}

int n, m, tot, a, b;
int tr[505][505];
int color[505][505];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

bool judge(int x, int y){
    if(x > n || x < 1 || y > m || y < 1)return false;
    if(color[x][y])return false;
    return true;
}

void dfs(int x, int y){
    color[x][y] = tot;
    for(int i = 0; i < 4; ++i){
        int xx = x + dx[i];
        int yy = y + dy[i];
        if(judge(xx, yy) && tr[x][y] == tr[xx][yy]){
            dfs(xx, yy);
        }
    }
    return;
}

int in[MAX], out[MAX];

int main(){
    sdd(m, n);
    for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j)sd(tr[i][j]);
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            if(!color[i][j]){
                ++tot;
                dfs(i, j);
            }
        }
    }
    if(tot == 1){//特判
        cout<<0<<endl;
        return 0;
    }
    for(int x = 1; x <= n; ++x){
        for(int y = 1; y <= m; ++y){
            for(int k = 0; k < 4; ++k){
                int xx = x + dx[k];
                int yy = y + dy[k];
                if(xx > 0 && xx <= n && yy > 0 && yy <= m && tr[x][y] > tr[xx][yy]){
                    ++in[color[xx][yy]];
                    ++out[color[x][y]];
                }
            }
        }
    }

    for(int i = 1; i <= tot; ++i){
        if(!in[i])++a;
        if(!out[i])++b;
    }
    cout<<max(a, b)<<endl;
    return 0;
}
全部评论

相关推荐

从大一开始就开始学习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这一次腾讯面试体验真的不错,每个面试官能感觉到专业能力很强,反馈很足,比起隔壁某节真是好太多以后就是鹅孝子了
三本咋了:当面试官这么多年你是我见过的最好的一个
你面试被问到过哪些不会的...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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