首页 > 其他分享 >牛客小白月赛75 D 矩阵

牛客小白月赛75 D 矩阵

时间:2023-07-04 23:14:17浏览次数:43  
标签:Cnt const int add 牛客 75 小白月赛 include id

题目链接

数据范围
n,m <= 1e3

题解

构建分层图,\((i , j , 0 / 1)\) 表示在矩阵的\((i , j)\) 位置上,当前状态为\(0 / 1\) 的点。

如果要到达的点和当前点的状态不同,则可以花费时间1到达。

如果状态相同,则要先花费时间1改变目标点的状态再走,共花费时间2.

然后就是跑最短路了。

另外

讲题的大佬还说若想要优化掉log,可以根据这题的距离很小的特性优化\(Dij\),开一些队列\(q[N]\),其中\(q[i]\)表示dis为\(i\)的点有哪些.

这样找未更新的点中dis最小的点就是寻找第一个非空队列。

虽然没有尝试过,但是感觉这个常数应该会比log要大一些吧,在总距离小的时候应该很管用。

一直搞不太清楚怎么建图,开始的时候将不同层不同点连1的边相同层不同点连2的边,在将状态0和状态1之间连边。但是很尴尬的是,发现这个图的建立和读入数据没有了关系……

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 1010;
int n , m , Cnt;
int A[N][N] , head[N * N * 2] , D[N * N * 2] , Vis[N * N * 2];

struct edge{ int v , nex , c; }e[N * N * 2 * 4 * 2];

inline int id(int x , int y , int op)
{
	return (x - 1) * m + y + op * n * m;
}

inline void add(int u , int v , int c)
{
	e[++Cnt].v = v; e[Cnt].c = c; e[Cnt].nex = head[u]; head[u] = Cnt;
}

int main()
{
	queue<int> q;
	int a , b , x;
	const int dx[] = {1 , -1 , 0 , 0};
	const int dy[] = {0 , 0 , 1 , -1};
	scanf("%d%d" , &n , &m);
	for(int i = 1 ; i <= n ; ++i)
		for(int j = 1 ; j <= m ; ++j)
			scanf("%1d" , &A[i][j]);
	for(int i = 1 ; i <= n ; ++i)
		for(int j = 1 ; j <= m ; ++j)
		{
			for(int k = 0 ; k < 4 ; ++k)
			{
				a = i + dx[k]; b = j + dy[k];
				if(a < 1 || a > n || b < 1 || b > m) continue;  
				add(id(i , j , 0) , id(a , b , 1) , 1 + (0 == A[a][b]));
				add(id(i , j , 1) , id(a , b , 0) , 1 + (1 == A[a][b]));	
			}
		}
	q.push(id(1 , 1 , A[1][1]));
	for(int i = 1 ; i <= n ; ++i)
		for(int j = 1 ; j <= m ; ++j)
			D[id(i , j , 0)] = D[id(i , j , 1)] = 1e8;
	D[id(1 , 1 , A[1][1])] = 0; Vis[id(1 , 1 , A[1][1])] = 1;
	while(q.size())
	{
		x = q.front(); q.pop(); Vis[x] = 0;
		for(int i = head[x] ; i ; i = e[i].nex)
		{
			int v = e[i].v;
			if(D[v] > D[x] + e[i].c)
			{
				D[v] = D[x] + e[i].c;
				if(!Vis[v]) Vis[v] = 1 , q.push(v);
			}
		}
	}
	printf("%d\n" , min(D[id(n , m , 0)] , D[id(n , m , 1)]));
	return 0;
}
/*
4 4
1111
1111
1010
0101
*/

标签:Cnt,const,int,add,牛客,75,小白月赛,include,id
From: https://www.cnblogs.com/sybs5968QAQ/p/17527306.html

相关文章

  • 牛客小白月赛74 G 跳石头,搭tizi
    题目链接)数据范围,2e5区间越长越省力。对于一个起点来说,从这里搭tizi最远到达的是序列中右侧第一个大于它的数所在的位置。用单调栈可以找到这样的区间,这些区间大致如下所示。就是最多只会有包含的情况,但是不会出现交叉的情况。然后可以这样渐次登高,到达最顶端。下降的......
  • 钡铼技术多功能RTU S475多功能RTU改变养殖行业现殖效率
    在养殖行业中,对环境参数的精确监测与控制至关重要。然而,传统的监测方法往往存在诸多痛点,如数据采集不准确、传输速度慢、可视化效果差等。为了解决这些问题,钡铼技术公司推出了其旗舰产品——S475多功能RTU,该产品在养殖行业监测中展现出了显著的优势。钡铼S475多功能RTU是一款......
  • 油田智能化转型:钡铼技术多功能RTUS475的关键角色
    标题:S475在油田数据采集中的应用摘要:本文介绍了钡铼技术多功能RTUS475在油田数据采集中的应用。该设备基于高性能微处理器MCU和嵌入式实时操作系统,支持ModbusSlave和ModbusMaster功能,并能通过无线网络实现短信报警和数据传输到监控中心,为油田数据采集提供了稳定可靠的解决方......
  • 牛客练习赛 112 B~C题题解
    卡B题了,难受B.qsggandSubarrayB-qsggandSubarray_牛客练习赛112(nowcoder.com)题意给定一个长为n的序列,求有多少个子区间的按位与和为0。思路要想按位与之和为0,那么对于区间的所有数,每个二进制位都要有一个0。设f[i]表示二进制位i的最右边一个0出现的位置,枚举序列的每......
  • 19C-19.16 ORA-17503 ORA-27300 ORA-27301 ORA-27302
    ***alter日志告警2023-07-01T02:05:13.474592+08:00Errorsinfile/u01/app/oracle/diag/rdbms/dg/dg1/trace/dg1_ora_17925.trc:ORA-17503:ksfdopn:2Failedtoopenfile+DATA/dg/PASSWORD/pwddgORA-27300:OSsystemdependentoperation:openfailedwithstatus:13ORA-......
  • CF1753
    CF1753成功因为虚拟机炸了,重新写一遍此文。都是没有保存的错。A.MakeNonzeroSum由于Notethatitisnotrequiredtominimizethenumberofsegmentsinthepartition.。考虑每一段最小化……可以发现,每一段都可以划分为长度为1或2的段。于是考虑影响。只有长......
  • 牛客小白月赛75
    D:给定01矩阵,规定0可以到1,1可以到0,将当前1变为0,将当前0变为1,花费都是1问从(1,1)走到(n,m)花费是多少,前提是移动都是相邻的点  考虑bfs,需要处理的是把当前点转化这个问题,其实可以分两种情况,对于相邻的点来说判断当前点和相邻点的点数是否相同而赋予两点之间的权值,不相邻的点也......
  • 牛客小白月赛75
    A.上班题意:分析:签到题代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){intx,y,z;cin>>x>>y>>z;cout<<x+min(y,z);return0;}B.崇拜题意:分析:按知识点难度从大到小排序,然后计算按这个顺序讲解的最大崇......
  • CS7530CC支持PD3.0,双C口协议芯片,20-35W功率
    协议支持:1,USB电源PD3.0固定PDO2,USB电源PDPPSPDO3,支持20W~35WPDO配置4,USBTYPE-C,CC-逻辑5V/3A5,支持双口TypeC快速充电与单电源6,2kVHBM和1kVCDMESD静电防护等级7,40°C~+125°C工作温度,符合RoHS和无卤素快充协议芯片的作用:1、快速充电管理:快充协议芯片能够根据充电设备和电源......
  • 【牛客小白75】D 矩阵 【bfs+优先队列】
    题目https://ac.nowcoder.com/acm/contest/60063/D题意是说,给你一张\(n*m(n,m\leq10^3)\)大小的01地图,当前点下一步只能走到相邻的点上,如果这两个点值相同,则代价为2,否则代价为1,问从(1,1)走到(n,m)最少代价是多少思路首先很容易想到只往右下走是错的,有可能往左和往上走总代价更......