[ZJOI2014] 璀璨光华(bfs建图 + dfs搜索)

problem

luogu-P3342

solution

你感觉这道题没考什么,又感觉考了什么

通过样例以及题面,我们并未获取到『立方体每个小方块的编号是按一定规则命名』的信息。

也就是说,我们需要通过输入的每个小方块相邻的编号的信息来建出这个立方体的坐标系。

我的做法较暴力但不用思考太多,简单易上手。你值得拥有

  • 首先,我们先随便找一个三度点(只有三个水晶和该水晶有公共面),钦定为 (1,1,1)(1,1,1)(1,1,1)

    然后以这个点 bfs\text{bfs}bfs 搜,得到每个点的距离,我们记为 dis0dis_0dis0

  • 其次,我们再随便找一个与上一个点距离恰好为 2n−22n-22n2 的点,即 dis0(i)=2n−2dis_0(i)=2n-2dis0(i)=2n2,钦定为 (n,n,1)(n,n,1)(n,n,1)

    然后以这个点 bfs\text{bfs}bfs 搜,得到每个点的距离,我们记为 dis1dis_1dis1

  • 接着,我们仍随便找一个与上两个点距离恰都为 n−1n-1n1 的点,即 dis0(i)=dis1(i)=n−1dis_0(i)=dis_1(i)=n-1dis0(i)=dis1(i)=n1,钦定为 (n,1,1)(n,1,1)(n,1,1)

    然后以这个点 bfs\text{bfs}bfs 搜,得到每个点的距离,我们记为 dis2dis_2dis2

这里的距离指的是曼哈顿距离 x,y,zx,y,zx,y,z 三维坐标差的绝对值之和。

考虑小方块 iii 的距离信息点对 (dis1(i)−dis0(i),dis2(i)−dis0(i))\Big(dis_1(i)-dis_0(i),dis_2(i)-dis_0(i)\Big)(dis1(i)dis0(i),dis2(i)dis0(i))

observation1:\text{observation1}:observation1: 该点对与 iii 的真正的 zzz 坐标无关。

observation2:\text{observation2}:observation2: 该点对与小方块的真正 (x,y)(x,y)(x,y) 坐标存在一一对应关系。这只能自己臆想了

在这里插入图片描述

dis0(i)=(x,y,z)↔(1,1,1)dis_0(i)=(x,y,z)\leftrightarrow (1,1,1)dis0(i)=(x,y,z)(1,1,1),所以我们可以选择通过 dis0(i)dis_0(i)dis0(i) 与已经求出的 x,yx,yx,y 来推出小方块的 zzz 坐标。

最后只用 dfs\text{dfs}dfs 暴搜枚举每个特殊发光小水晶扩散的方向,O(6n)O(6^n)O(6n)

然后 check\text{check}check 沿着该方向枚举一路上的水晶,用 visvisvis 标记是否已经访问过了,非第一次访问不计入发光贡献。

最后清空 vis\text{vis}vis 数组,也是按照方向清空。不然就是 O(a3)O(a^3)O(a3) 的复杂度了。

时间复杂度 O(6na)O(6^na)O(6na)

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 400000
#define MAX 150
struct node { int x, y, z; }pos[MAX << 2][MAX << 2];
vector < int > G[maxn];
vector < node > NB;
int g[maxn], dir[maxn];
int dis[3][maxn];
int vis[MAX][MAX][MAX], val[MAX][MAX][MAX];
int Min = 1e9, Max = -1e9, n, m;
queue < int > q;void bfs( int s, int *dis ) {dis[s] = 0; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int v : G[u] ) if( dis[v] > dis[u] + 1 ) dis[v] = dis[u] + 1, q.push( v );}
}void calc() {int sum = 0;for( int k = 0;k < NB.size();k ++ ) {int x = NB[k].x, y = NB[k].y, z = NB[k].z;switch( dir[k] ) {case 0 : {for( int i = 1;i <= x;i ++ )if( ! vis[i][y][z] )vis[i][y][z] = 1, sum += val[i][y][z];break;}case 1 : {for( int i = x;i <= n;i ++ )if( ! vis[i][y][z] )vis[i][y][z] = 1, sum += val[i][y][z];break;}case 2 : {for( int i = 1;i <= y;i ++ )if( ! vis[x][i][z] )vis[x][i][z] = 1, sum += val[x][i][z];break;}case 3 : {for( int i = y;i <= n;i ++ )if( ! vis[x][i][z] )vis[x][i][z] = 1, sum += val[x][i][z];break;}case 4 : {for( int i = 1;i <= z;i ++ )if( ! vis[x][y][i] )vis[x][y][i] = 1, sum += val[x][y][i];break;}case 5 : {for( int i = z;i <= n;i ++ )if( ! vis[x][y][i] )vis[x][y][i] = 1, sum += val[x][y][i];break;}}}Min = min( Min, sum ), Max = max( Max, sum );for( int k = 0;k < NB.size();k ++ ) {int x = NB[k].x, y = NB[k].y, z = NB[k].z;switch( dir[k] ) {case 0 : for( int i = 1;i <= x;i ++ ) vis[i][y][z] = 0; break;case 1 : for( int i = x;i <= n;i ++ ) vis[i][y][z] = 0; break;case 2 : for( int i = 1;i <= y;i ++ ) vis[x][i][z] = 0; break;case 3 : for( int i = y;i <= n;i ++ ) vis[x][i][z] = 0; break;case 4 : for( int i = 1;i <= z;i ++ ) vis[x][y][i] = 0; break;case 5 : for( int i = z;i <= n;i ++ ) vis[x][y][i] = 0; break;}}
}void dfs( int x ) {if( x == NB.size() ) return calc(), void();for( int i = 0;i < 6;i ++ ) dir[x] = i, dfs( x + 1 );
}int CalcDis( int x, int y, int a, int b ) { return fabs( x - a ) + fabs( y - b ); }int main() {memset( dis, 0x3f, sizeof( dis ) );scanf( "%d", &n );m = n * n * n;for( int i = 1, id;i <= m;i ++ ) {scanf( "%d", &g[i] );do { scanf( "%d", &id ), G[i].push_back( id ); } while( getchar() != '\n' );}int p1, p2, p3;for( int i = 1;i <= m;i ++ ) if( G[i].size() == 3 ) p1 = i;val[1][1][1] = g[p1]; bfs( p1, dis[0] );for( int i = 1;i <= m;i ++ ) if( G[i].size() == 3 and dis[0][i] == (n - 1 << 1) ) p2 = i;val[n][n][1] = g[p2]; bfs( p2, dis[1] );for( int i = 1;i <= m;i ++ ) if( G[i].size() == 3 and dis[0][i] == n - 1 and dis[1][i] == n - 1 ) p3 = i;val[n][1][1] = g[p3]; bfs( p3, dis[2] );for( int i = 1;i <= n;i ++ )for( int j = 1;j <= n;j ++ ) {int d0 = CalcDis( 1, 1, i, j );int d1 = CalcDis( n, n, i, j );int d2 = CalcDis( n, 1, i, j );pos[MAX + d1 - d0][MAX + d2 - d0] = { i, j, 1 };}for( int i = 1;i <= m;i ++ ) {node p = pos[MAX + dis[1][i] - dis[0][i]][MAX + dis[2][i] - dis[0][i]];p.z = dis[0][i] - CalcDis( 1, 1, p.x, p.y ) + 1;val[p.x][p.y][p.z] = g[i];if( ! g[i] ) NB.push_back( p );}dfs( 0 );printf( "%d %d\n", Min, Max );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SignalR 中丰富多彩的消息推送方式

在上一篇 SignalR 文章中&#xff0c;演示了如何通过 SignalR 实现了简单的聊天室功能&#xff1b;本着简洁就是美的原则&#xff0c;这一篇我们也来聊聊在 SignalR 中的用户和组的概念&#xff0c;理解这些基础知识有助于更好的开发基于 SignalR 的应用&#xff0c;通过对用户…

Visual Studio 2019 使用 Live Share

一.前言Visual Studio 2019 在今天发布&#xff08;北京时间&#xff09;了&#xff0c;这次带来了一个比较有趣的 Live Share 功能&#xff0c;使用它可以进行更好的协作开发。主要功能&#xff1a;更多资料可看官方介绍&#xff1a;Visual Studio 实时共享什么是Visual Studi…

cf1523B. Lord of the Values

cf1523B. Lord of the Values 题意&#xff1a; 给你一个数组&#xff0c;有n个数&#xff0c;n为偶数&#xff0c;a1&#xff0c;a2…an 现在有两个操作&#xff1a; 对于i<j 操作1&#xff1a;aiaiaj 操作2&#xff1a;ajaj-ai 把原数组转换为-a1,-a2,-a3… 题解&#…

Asp.Net Core WebAPI使用Swagger时API隐藏与分组

1、前言为什么我们要隐藏部分接口&#xff1f;因为我们在用swagger代替接口的时候&#xff0c;难免有些接口会直观的暴露出来&#xff0c;比如我们结合Consul一起使用的时候&#xff0c;会将健康检查接口以及报警通知接口暴露出来&#xff0c;这些接口有时候会出于方便考虑&…

为您的机器配置开发环境

软件准备在本期视频中&#xff0c;我们将安装所序言的软件&#xff0c;并为我们的电脑配置.NET Core开发环境。我们需要安装如下2个软件&#xff1a;一个编辑器.NET Core SDK&#xff08;Software Development Kit&#xff09;下载并安装.NET Core 开发编辑器我的是Windows操作…

[CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)

problem luogu-P3160 solution 这么小的数据范围&#xff0c;非暴力不状压。暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了。 我们不妨从小到大填数字&#xff0c;这样如果局部极小值点还没有填的话&#xff0c;周围的九宫格就一定不能被填。 设 dp(s,i):dp(s,i):dp(s,i): 局…

基于Kubernetes 构建.NET Core 的技术体系

很多公司技术支持岗位的工作&#xff0c;如配置域名&#xff0c;部署环境&#xff0c;修改复位配置&#xff0c;服务重启&#xff0c;扩容缩容&#xff0c;梳理和完善监控&#xff0c;根据开发的需要查找日志等工作&#xff0c;需要和开发进行大量的沟通&#xff0c;如什么是外…

[CQOI2014] 危桥(网络流)

problem luogu-P3163 solution 这是一道网络流好题&#xff0c;看的着摸不着吃不着。 初读完题&#xff0c;就知道这是一道“脱光了”的最大流。 建图基础版本&#xff1a; 建立额外源汇点。 无向边相同于两条有向边&#xff0c;直接建不影响&#xff0c;危桥流量设成 22…

那些优秀的开发者----汪宇杰:从重视细节,到成就技术专家

汪宇杰&#xff08;Edi Wang&#xff09;&#xff0c;.NET及Windows开发者&#xff0c;2018-2019年度微软最有价值专家&#xff08;Windows Development方向&#xff09;。现担任某金融科技企业的网站开发工程师。他对微软技术有鉴定的信念和不灭的热情&#xff0c;曾在Windows…

P4062 [Code+#1]Yazid 的新生舞会(线段树做法)

P4062 [Code#1]Yazid 的新生舞会&#xff08;线段树做法&#xff09; 题意&#xff1a; 给你一个序列a[1…n]​&#xff0c;求存在绝对众数的子区间个数。 绝对众数指&#xff1a;区间中出现次数最多的那个数&#xff0c;出现次数严格大于区间长度的一半。 题解&#xff1a…

《从零开始学ASP.NET CORE MVC》课程介绍

大家好&#xff0c;欢迎来到52ABP学院&#xff0c;收看我们的 《从零开始学ASP.NET CORE MVC》。ASP.NET Core 简介从2015年开始随时互联网成长&#xff0c;云计算和AI、大数据的爆发&#xff0c;大家从谈论项目信息化到数字化的转型&#xff0c;从ToC产业到ToB产业的转型&…

Docker - 容器部署 Consul 集群

目录 准备 Consul 镜像安装单个 Consul组装集群 Consul启动 Consul 和 Web 管理器Consul 命令简单介绍Web 管理器Server 加入集群Client 加入集群了解 ConsulConsul 使用场景Consul 优势Consul 中的概念说明简介安装总结引用和附件说明本文主要介绍怎么使用 Docker 在 Linux…

VS2017创建ASP.NET Core Web程序

创建ASP.NET Core Web应用程序如果您使用的是VS2019 请看 VS2019创建ASP.NET Core Web程序在这个视频中我们将讨论可用的不同项目模板及其功能预制的项目模板有什么不同&#xff0c;哪些是可以使用的&#xff0c;以及他们的作用。在Visual Studio2017中创建新的ASP.NET Core 项…

巧用linux版powershell,管理linux下的docker

owershell,docker,cli,命令,docker ps,docker image第一章 在linux中搭建docker环境目的&#xff1a;在任意版本的linux&#xff08;物理机&#xff0c;虚拟机&#xff0c;节点机&#xff09;中&#xff0c;安装docker服务。动作&#xff1a;教程略&#xff0c;不是本文主要目的…

从ASP.NET Core2.2到3.0你可能会遇到这些问题

趁着假期的时间所以想重新学习下微软的官方文档来巩固下基础知识。我们都知道微软目前已经发布了.NET Core3.0的第三个预览版&#xff0c;同时我家里的电脑也安装了vs2019。So&#xff0c;就用vs2019.NET Core3.0来跟着做一下Contoso University这个WEB应用&#xff0c;但是在基…

EntityFramework Core 3.0 Preview

前段时间.Net Core 3.0 发布了&#xff0c;Entity Framework Core 3.0 也发布了Preview版。假期用了一上午大致研究了一遍&#xff0c;同时又体验了一把Visual Studio 2019。总结一下分享给大家&#xff1a;VS2019 新建.Net Core 3.0 Console应用&#xff0c;添加EFCore相关的N…

机器学习 ML.NET 发布 1.0 RC

ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架&#xff08;Windows&#xff0c;Linux&#xff0c;macOS&#xff09;,通过使用ML.NET,.NET开发人员可以利用他们现有的工具和技能组&#xff0c;为情感分析&#xff0c;推荐&#xff0c;图像分类等常见场景创建自定义机器…

容器化时代我们应当选择Kubernetes

昨天发的文章《基于Kubernetes 构建.NET Core 的技术体系》&#xff0c;有同学问.NET Core上有Spring Cloud类似的平台吗&#xff1f; .NET Core出现这么久了&#xff0c;这个为云原生应用开发而准备的系统需要Spring cloud这样的全家桶吗&#xff1f; 大家希望使用Spring Clou…

[ZJOI2015]幻想乡 Wi-Fi 搭建计划(dp + 结论)

problem luogu-P3344 solution 这个题面&#xff0c;这个数据范围&#xff0c;完完全全就是网络流宗教。。然而我发现建不出来。 很多一眼网络流最后却不是网络流而往往是 dpdpdp 的题目都有一个特性&#xff1a;一个点可以流出多条流量&#xff0c;流入流量却只能为 111。…

CefSharp中c#和JavaScript交互读取电脑信息

介绍CEF是由Marshall Greenblatt于2008年创建的基于Google Chromium的BSD许可开源项目。与主要关注谷歌Chrome应用程序开发的Chromium项目本身不同&#xff0c;CEF专注于在第三方应用程序中促进嵌入式浏览器用例。CEF通过提供生产质量稳定的API&#xff0c;发布跟踪特定Chromiu…