UVALive 3977

直接搜索,简单题;

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define maxn 505
#define ll long long
using namespace std;

int map[maxn][maxn];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int vis[maxn][maxn];

struct node
{
    int x,y,d;
    node(int x=0,int y=0,int d=0):x(x),y(y),d(d){}
    bool operator<(const node &t)const
    {
        return d>t.d;
    }
}arr[maxn*maxn];

queue<node>q;

int main()
{
    int t,n,m,d;
    scanf("%d",&t);
    while(t--)
    {
        int cnt=0;
        scanf("%d%d%d",&n,&m,&d);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&map[i][j]);
                arr[cnt++]=node(i,j,map[i][j]);
            }
        }

        memset(vis,-1,sizeof vis);
        int ans=0;
        sort(arr,arr+cnt);
        while(!q.empty())q.pop();

        for(int i=0;i<cnt;i++)
        {
            node v=arr[i];
            if(vis[v.x][v.y]!=-1)continue;
            bool flag=1;
            int bound=v.d-d;
            int peak=v.d;
            q.push(v);
            int cot=1;

            while(!q.empty())
            {
                node u=q.front();
                q.pop();
                vis[u.x][u.y]=peak;
                for(int i=0;i<4;i++)
                {
                    node tmp;
                    tmp.x=u.x+dir[i][0];
                    tmp.y=u.y+dir[i][1];
                    if(tmp.x<1||tmp.x>n||tmp.y<1||tmp.y>m)continue;
                    tmp.d=map[tmp.x][tmp.y];
                    if(tmp.d<=bound)continue;
                    if(vis[tmp.x][tmp.y]!=-1)
                    {
                        if(vis[tmp.x][tmp.y]!=peak)
                            flag=0;
                        continue;
                    }
                    vis[tmp.x][tmp.y]=peak;
                    if(tmp.d==peak)cot++;
                    q.push(tmp);
                }
            }
            if(flag)
                ans+=cot;
        }
        printf("%d\n",ans);
    }
    return 0;
}

UVALive 3977

时间: 2024-10-08 13:35:52

UVALive 3977的相关文章

UVALive 3977 BFS染色

这个题意搞了半天才搞明白 就是如果定义一个d-summit,即从该点到另一个更高的点,经过的路径必定是比当前点低至少d高度的,如果该点是最高点,没有比他更高的,就直接视为顶点 其实就是个BFS染色,先按降序排序,然后每个点对其可到达的点染色,h-d的点为边界,走到这里就不用往下染了 然后其他店染色的时候若产生冲突,则非d—summit,否则该点为顶点 今天还有COJ上一个BFS染色的题目,一直TLE...还没弄出来 #include <iostream> #include <cstdio

UVALive - 3977 Summits (BFS染色)

题目大意:坑爹的题目,题意那么难理解. 讲的就是,如果该点是山顶的话(高度为h),那么以该点为中心,往外辐射,走高度大于h-d的点,到达不了另一个比它高的点 这就提示了,高度要从大到小排序,依次以高的点(假设高度为h)为核心辐射,如果碰上高度小于等于h-d的,表示此路不通了,就在该处停止 反之,如果碰上高度大于h-d的,且没有被染色过的,那么就将其染色 如果碰上高度大于h-d的,且被染色的话,就表明可以走到另一个更高点了,那么此点就不是山顶了 如果中途碰到了和该点一样高的,那么山顶的数量就加1

UVALive 4848 Tour Belt

F - Tour Belt Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 4848 Description Korea has many tourist attractions. One of them is an archipelago (Dadohae in Korean), a cluster of small islands sca

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre

UVALive 7077 Little Zu Chongzhi&#39;s Triangles (有序序列和三角形的关系)

这个题……我上来就给读错了,我以为最后是一个三角形,一条边可以由多个小棒组成,所以想到了状态压缩各种各样的东西,最后成功了……结果发现样例过不了,三条黑线就在我的脑袋上挂着,改正了以后我发现N非常小,想到了回溯每个棍的分组,最多分5组,结果发现超时了……最大是5^12 =  244,140,625,厉害呢…… 后来想贪心,首先想暴力出所有可能的组合,结果发现替换问题是一个难题……最后T T ,我就断片了.. 等看了别人的办法以后,我才发现我忽视了三角形的特性,和把数据排序以后的特点. 如果数据从

Gym 100299C &amp;&amp; UVaLive 6582 Magical GCD (暴力+数论)

题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点时,我们对gcd相同的只保留一个,那就是左端点最小的那个,只有这样才能保证是最大,然后删掉没用的. UVaLive上的数据有问题,比赛时怎么也交不过,后来去别的oj交就过了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&qu

UVALive 6511 Term Project

Term Project Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 651164-bit integer IO format: %lld      Java class name: Main 解题:强连通分量 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1

UVALive 6508 Permutation Graphs

Permutation Graphs Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 650864-bit integer IO format: %lld      Java class name: Main 解题:逆序数 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long l

UVALive 2659+HUST 1017+ZOJ 3209 (DLX

UVALive 2659 题目:16*16的数独.试了一发大白模板. /* * @author: Cwind */ //#pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <map> #include <algorithm> #include <cstdio> #include <cstring> #include