题意:

构造一个矩阵,使得:

矩阵所有格子中数字都小于等于原矩阵,并且至少有一个元素和原矩阵相等,

构造的矩阵除了0以外的数字必须联通并且相等,矩阵中元素之和为K。

n,m<=1e3,1<=K<=1e18

思路:

From https://blog.csdn.net/morejarphone/article/details/51037918

对每个格子的数字进行排序,那么一个格子的数字最多能够填的格子数就是他上下左右格子能够填的格子

数的和,这个可以用并查集来维护

然后枚举每个格子,如果这个格子的数字能够整除k并且这个格子能够填的个数足够,就可以从这个格子出发

bfs一遍找到需要的格子

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second s
#define MP make_pair
#define N 1100
#define M 1100000
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
#define oo 2e9+1 int dx[]={,-,,},
dy[]={,,-,}; struct node
{
int x,y;
ll z;
}b[M],q[M]; ll a[N][N],K;
int vis[N][N],num[N][N],f[M],size[M],n,m; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} bool cmp(node a,node b)
{
return a.z>b.z;
} int find(int k)
{
if(f[k]!=k) f[k]=find(f[k]);
return f[k];
} void bfs(int x,int y,ll cnt)
{
int t=;
int w=;
q[].x=x; q[].y=y;
memset(vis,,sizeof(vis));
vis[x][y]=;
cnt--;
while(t<=w&&cnt)
{
t++;
int nowx=q[t].x;
int nowy=q[t].y;
vis[nowx][nowy]=;
for(int i=;i<;i++)
{
int tx=nowx+dx[i];
int ty=nowy+dy[i];
if(!tx||tx>n||!ty||ty>m||vis[tx][ty]) continue;
if(a[tx][ty]>=a[x][y])
{
vis[tx][ty]=;
q[++w].x=tx;
q[w].y=ty;
cnt--;
if(cnt<=) break;
}
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(vis[i][j]) printf("%lld",a[x][y]);
else printf("");
if(j<m) printf(" ");
}
printf("\n");
}
} int main()
{
//freopen("cf659f.in","r",stdin);
//freopen("cf659f.out","w",stdout);
scanf("%d%d%lld",&n,&m,&K);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) scanf("%lld",&a[i][j]);
int tot=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
num[i][j]=(i-)*m+j;
size[num[i][j]]=;
f[num[i][j]]=num[i][j];
b[++tot].x=i;
b[tot].y=j;
b[tot].z=a[i][j];
}
sort(b+,b+tot+,cmp); memset(vis,,sizeof(vis));
for(int i=;i<=tot;i++)
{
vis[b[i].x][b[i].y]=;
for(int j=;j<;j++)
{
int x=b[i].x+dx[j];
int y=b[i].y+dy[j];
if(x&&x<=n&&y&&y<=m&&vis[x][y])
{
int p=find(num[b[i].x][b[i].y]);
int q=find(num[x][y]);
if(p!=q)
{
f[q]=p;
size[p]+=size[q];
}
}
}
} // for(int i=1;i<=n;i++)
// for(int j=1;j<=m;j++) printf("%d\n",size[num[i][j]]); int ans=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
if(K%a[i][j]==&&size[num[i][j]]>=K/a[i][j])
{
printf("YES\n");
bfs(i,j,K/a[i][j]);
ans=; break;
}
if(ans) break;
}
if(!ans) printf("NO"); }

【CF659F】Polycarp and Hay(并查集,bfs)的更多相关文章

  1. Codeforces Round #346 (Div. 2) F. Polycarp and Hay 并查集 bfs

    F. Polycarp and Hay 题目连接: http://www.codeforces.com/contest/659/problem/F Description The farmer Pol ...

  2. codeforces 659F F. Polycarp and Hay(并查集+bfs)

    题目链接: F. Polycarp and Hay time limit per test 4 seconds memory limit per test 512 megabytes input st ...

  3. Codeforces Round #346 (Div. 2) F. Polycarp and Hay 并查集

    题目链接: 题目 F. Polycarp and Hay time limit per test: 4 seconds memory limit per test: 512 megabytes inp ...

  4. Codeforces 659F Polycarp and Hay 并查集

    链接 Codeforces 659F Polycarp and Hay 题意 一个矩阵,减小一些数字的大小使得构成一个连通块的和恰好等于k,要求连通块中至少保持一个不变 思路 将数值从小到大排序,按顺 ...

  5. 并查集+bfs+暴力滑窗 Codeforces Round #356 (Div. 2) E

    http://codeforces.com/contest/680/problem/E 题目大意:给你一个n*n的图,然后图上的 . (我们下面都叫做‘点’)表示可以走,X表示不能走,你有如下的操作, ...

  6. 判断无向图是否有环路的方法 -并查集 -BFS

    可以利用并查集或者带颜色标记的BFS(来自算法导论)判断. 首先介绍第一种,用并查集来判断: 首先初始化所有元素的根为-1,-1代表根节点,接下来对于图中的每一条边(v1,v2)都并入集合,并入的方式 ...

  7. 7-10 社交网络图中结点的“重要性”计算(30 point(s)) 【并查集+BFS】

    7-10 社交网络图中结点的"重要性"计算(30 point(s)) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络 ...

  8. 【NOIP 2015 D1 T2】信息传递(图论--带权并查集/bfs)

    题目:有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学.游戏开始时,每人都只知道自己的生日.之后每一轮中, ...

  9. LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS

    这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...

随机推荐

  1. cookie安全

    www.baidu.com host 文件 定义 a.baidu.com 为127.0.01 本地编写php程序 读取浏览器发送给 a.baidu.com的cookie 会把 .baidu.com域下 ...

  2. make 与makefile(会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。)

    跟我一起写 Makefile /**/ 陈皓 (CSDN) 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉 ...

  3. 1991: C语言实验——大小写转换

    1991: C语言实验——大小写转换 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 183  Solved: 109[Submit][Status][We ...

  4. linux环境nginx的安装与使用

    因为公司需要需要安装一系列环境,新手上路第一次配的时候什么也不懂在网上找了半天,觉得这篇不错,我在这里顺便记录一下.(原文:https://www.cnblogs.com/wyd168/p/66365 ...

  5. UIScreen, UIWindow

    模仿书上或网上的例子,每次最开始就是 在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: ...

  6. Educational Codeforces Round 40千名记

    人生第二场codeforces.然而遇上了Education场这种东西 Educational Codeforces Round 40 下午先在家里睡了波觉,起来离开场还有10分钟. 但是突然想起来还 ...

  7. database---many to many relationships(多对多关系型数据库)

    Many to many Relationships A many-to-many relationship occurs when multiple records in a table are a ...

  8. service worker 消息推送

    https://developers.google.com/web/fundamentals/codelabs/push-notifications/?hl=en 首先下载源码: git clone ...

  9. vue中 表头th 合并单元格,且表格列数不定的动态渲染方法

    吐槽 今天,在vue中遇到 复杂表格的渲染 ,需要合并表头的单元格,且合并单元格的那列还是动态数据,也就是说你不知道会有多少组要合并起来,哎,我也有点说不清楚,废话不多说了,看代码把: 代码示例 da ...

  10. 【cpu】CPU版本认识

    此图应该是摘选自<鸟哥的linux私房菜>