题意:

构造一个矩阵,使得:

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

构造的矩阵除了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. The Django Book 第三章 试图和URL配置

    之前自学Django也有一段时间了,再过一个月就要入职新公司了(Python Django开发),即使现在还在入门级徘徊,再好好把Django基础过一遍吧. The Django Book 第三章 试 ...

  2. java日期操作的工具类时间格式的转换

    package cn.itcast.oa.util; import java.text.ParseException; import java.text.SimpleDateFormat;import ...

  3. 使用js将后台返回的数据转换成树形结构

    将类似如下数据转换成树形的数据: [ { id: 1, name: '1', }, { id: 2, name: '1-1', parentId: 1 }, { id: 3, name: '1-1-1 ...

  4. Schur 三角化定理的推论

    将学习到什么 从 Schur 的酉三角化定理可以收获一批结果,在这一部分介绍重要的几个.   迹与行列式 相似矩阵具有相同的特征多项式, 从特征多项式一节中, 我们又知道,相似矩阵的迹以及行列式都是相 ...

  5. github+hexo+themes搭建简易个性主题博客

    0x00  install Node.js and git 安装Node.js:http://www.runoob.com/nodejs/nodejs-install-setup.html 安装git ...

  6. window nodejs 版本管理器 nvm-windows 教程

    先去https://github.com/coreybutler/nvm-windows/releases 下载nvm-setup.zip 安装 安装的过程中会提示是否获取nodejs的管理权限,点确 ...

  7. css布局--两列布局,左侧固定,右侧自适应(其中左侧要可以拖动,右侧水平滚动条)

    (css布局所要实现的效果) 在前端面试中经常会被问到CSS布局,两列布局,左侧固定,右侧自适应.前几天去面试,遇到了这道题的升级版,要求左侧可拖动,右侧要有水平滚动条.拿到题目确实有些大脑短路,不知 ...

  8. 【数学 裴蜀定理】bzoj2257: [Jsoi2009]瓶子和燃料

    使gcd最大的trick Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy的飞船上共有 N ...

  9. Django模型中字段属性choice的使用

    根据Django官方文档: from django.db import models class Student(models.Model): FRESHMAN = 'FR' SOPHOMORE = ...

  10. mysql:having 用法

    顺序:where -> group by -> min -> order by -> limit 在select语句中使用having 子句来指定一组行或聚合的过滤条件 hav ...