首页 > 其他分享 >CF1316D Nash Matrix(构造/dfs)

CF1316D Nash Matrix(构造/dfs)

时间:2023-11-10 22:22:05浏览次数:37  
标签:tx ty int CF1316D dfs nx ny 构造 Nash

题目

第一次做构造题,做了两节晚自习 qwq

一开始我完全是正着想,首先 \(X\) 是显然的,但其他的点就不好做了,

然后我就想,可行的一般结论推不出,那就想反例,然后我想啊想......倒是想到了几个,比如说环与环之间不能有相交,环内外的点不能互相到达,跟本举不完,而且也不好实现,还是要想一般结论。

然后我就去想,怎么从 \((x, y)\) 搜到该点目标 \((tx, ty)\) , 我一开始还默认为路径的长度只能是曼哈顿距离嘞,蒙在鼓里发现这样还有点搞头

后来发现完全可以四个方向随便走,这就真的不好暴搜了。(我直接想现场砸键盘了

其实总结下来就是,一个起点不足矣得到以它的目标 \((tx,ty)\) 为终点的整张 DAG ,所以不好实现。

但是,反过来,如果从终点向四周扩展,找起点,就简单了呀?!

所以可以总结一个一般经验:做构造题,特别是构造图,一定要考虑 正难则反


  • 考虑有限路径

正难则反,从每个终点向四周扩散,把目标都是该点的点都定上方向,这在正确构造中肯定是唯一的,所以每个点只染色一次。

  • 考虑无限路径

在正确构造中,无限路径肯定成环。

此时需要一点思维,可以发现,如果找到环中的两个相邻点,要构造一个无限循环,其实只要把这两个点互相指向,同时以这两个点向外扩散找环,

这样环上所有的点最后都会跑到这两个点之间反复横跳。

当然,这样的两两点对,对于一个点,可能有四个方向四种情况的其一。

最后,构造完之后,再跑一边图,看一下有没有空的点,有空的就说明给的条件一定不能构造出一个自洽的结果。

#include <bits/stdc++.h>
#define re register int 
using namespace std;
const int N = 1e3 + 10;
const int dx[4] = {0, -1, 0, 1};
const int dy[4] = {-1, 0, 1, 0};
const char rev[4] = {'R', 'D', 'L', 'U'};
struct Map
{
	int tx, ty;
}g[N][N];
int n;
char ans[N][N];

void dfs(int x, int y, int sx, int sy)
{
	for (re i = 0; i < 4; i ++)
	{
		int nx = x + dx[i], ny = y + dy[i];
		Map a = g[nx][ny];
		if (nx < 1 || nx > n || ny < 1 || ny > n || ans[nx][ny] || a.tx != sx || a.ty != sy)
			continue;
		ans[nx][ny] = rev[i];
		dfs(nx, ny, sx, sy);
	}
}

void work1()
{
	for (re i = 1; i <= n; i ++)
		for (re j = 1; j <= n; j ++)
		{
			Map a = g[i][j];
			if (i != a.tx || j != a.ty) continue;
			ans[i][j] = 'X';
			dfs(i, j, a.tx, a.ty);
		}
}

void work2()
{
	for (re i = 1; i <= n; i ++)
		for (re j = 1; j <= n; j ++)
		{
			if (g[i][j].tx == -1 && !ans[i][j])
			{
				if (g[i + 1][j].tx == -1) 
					ans[i][j] = 'D', ans[i + 1][j] = 'U', dfs(i, j, -1, -1), dfs(i + 1, j, - 1, -1);
				
				else if (g[i - 1][j].tx == -1)
					ans[i][j] = 'U', ans[i - 1][j] = 'D', dfs(i, j, -1, -1), dfs(i - 1, j, - 1, -1);
				
				else if (g[i][j + 1].tx == -1)
					ans[i][j] = 'R', ans[i][j + 1] = 'L', dfs(i, j, -1, -1), dfs(i, j + 1, - 1, -1);
				
				else if (g[i][j - 1].tx == -1)
					ans[i][j] = 'L', ans[i][j - 1] = 'R', dfs(i, j, -1, -1), dfs(i, j - 1, - 1, -1);
			}
		}
}

void print()
{
	bool flag = false;
	for (re i = 1; i <= n; i ++)
		for (re j = 1; j <= n; j ++)
			if (!ans[i][j])
			{
				flag = true;
				break;
			}
	if (flag) cout << "INVALID\n";
	else
	{
		cout << "VALID\n";
		for (re i = 1; i <= n; i ++)
		{
			for (re j = 1; j <= n; j ++)
				cout << ans[i][j];
			cout << '\n';
		}		
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> n;
	for (re i = 1; i <= n; i ++)
		for (re j = 1; j <= n; j ++)
			cin >> g[i][j].tx >> g[i][j].ty;
	work1();
	work2();
	print();
	return 0;	
}

标签:tx,ty,int,CF1316D,dfs,nx,ny,构造,Nash
From: https://www.cnblogs.com/hi-zwjoey/p/17825227.html

相关文章

  • 编译Fastdfs报错——In file included from ../common/fdfs_global.c:21:0: ../common
    记录一下安装fastdfs时编译报错,报错信息如下:原因:这是因为我们在安装较新版得fastdfs时,从github下载得安装包缺少文件,如果按照网上很多博主较早之前写的文档操作得话就会出现这样得错误,缺少了libserverframe网络框架解决方法:安装 libserverframe网络框架安装包下载地......
  • 分布式文件系统FastDFS
    目录目前系统存在的缺点分布式文件系统FastDFS介绍概念架构文件上传文件下载目前系统存在的缺点目前是通过tomcat提供虚拟目录的方式供用户访问;当然也可以通过nginx实现静态资源访问的方式文件冗余在tomcat挂了的情况下不能提供服务;目前是单一文件服务的存储(依赖tomcat不能进......
  • HDFS集群压测实践
    1.背景在部署Hadoop集群时,作为集群运维人员,往往需要了解集群性能。即集群能够处理数据的上限,集群的瓶颈等信息。特别是在上线一批尚未使用过的机型、磁盘时,更需要了解这些硬件上的变更是否会对集群整体性能有影响。本文介绍当DataNode挂载juicefs情况下,集群的性能表现;并且和只挂......
  • HDFS基于Ranger鉴权原理
    1.背景在HDFS中,默认是通过setacl和getacl命令的方式增加和查询hdfs的acl信息。为了了解acl信息,需要亲自登陆机器执行hdfs命令,对于没有机器权限的业务人员非常不友好;同时,运维人员无法浏览HDFS所有acl信息,对于管理来说也不透明。为了解决该问题,引入了Ranger组件,将acl信息存放到Ran......
  • PySpark判断Hdfs文件路径是否存在
    背景从ScalaSpark代码转PySpark代码,同时实现连续读多个文件,避免因某些路径不存在导致程序终止。在Scala的Spark中可以直接导下面两个模块的包importorg.apache.hadoop.conf.Configurationimportorg.apache.hadoop.fs._然后调用方法就可以实现对hdfs的文件判断了valfs=......
  • HDFS Balancer存储水位稳定性原理与实践
    1.背景在HDFS分布式系统中,经常会上线新的datanode以环境集群容量不足的问题。但是往往旧datanode水位较高,甚至爆满无法写入,新datanode非常空闲,导致旧机器无法写入数据,集群的流量集中到新datanode中,造成新datanode网络延迟。为了解决上述问题,可以通过Balancer工具定时讲高水位dat......
  • FastDFS基于Docker安装
    FastDFS基于Docker安装可参考dockerpulldelron/fastdfs构建Tracker容器使用docker镜像构建tracker容器,用于启动跟踪服务器,起到调度的作用。dockerrun-d--network=host--nametracker-v/data/fdfs:/var/fdfsdelron/fastdfstrackerdockerrun-d--network=host--nametra......
  • HDFS Distcp数据迁移与优化实践
    1.背景对于HDFS集群而言,不可避免会将一个集群中的数据迁移到另外一个集群中。一般以下几种情况需要进行迁移:hadoop2集群中的项目数据迁移到hadoop3中。hadooprbf的一个子集群block数量在2亿~3亿,需要将大项目迁移到其他空闲子集群。海外项目数据由于历史原因存放到国内集群,根......
  • HDFS冷热存储方案与实践
    1.背景HDFS存储的数据,一般情况下,创建时间越新的数据,访问次数越频繁;创建时间越久远的数据,访问频次越低。在HDFS集群中,默认情况下,所有数据都存放在同一类型介质中,大量访问频次低的数据没有被访问,浪费磁盘的性能。为了合理的降低成本,可以将访问次数频繁的数据存放在高速存储介质中,......
  • DFS、BFS模板
    目录DFSBFSDFS处理当前节点的位置不同对应着不同的遍历defpreorderTraversal(root):ifnotroot:returnprint(root.val)#前序遍历,处理当前节点preorderTraversal(root.left)#递归遍历左子树print(root.val)#中序遍历,处理当前节点pr......