[FJOI2018]所罗门的宝藏
大概是最后一篇题解,其实只是想颓废一下打个故事
据古代传说记载,所罗门王即是智慧的代表,又是财富的象征。他建立了强大而富有的国家,聚集了大批的黄金象牙和钻石,并把这些价值连城的珍宝藏在一个神秘的地方,这就是万世瞩目的“所罗门的宝藏”。多少个世纪以来,人们一直在寻找这批早已失落的古代文明宝藏,寻找盛产黄金和钻石的宝地。曾经追寻所罗门王宝藏的冒险者们都一去不回,至今没有人解开这个迷题。亨利男爵在一次幸运的旅行中以外地得到了三百年前一本葡萄牙贵族留下的写在羊皮卷上的所罗门王的宝藏图和一本寻宝秘笈。在这张藏宝图的诱惑下,亨利男爵邀请约翰上校和勇敢的猎象人夸特曼开始了寻找埋藏在黑暗地底的所罗门王宝藏的艰险历程。他们横穿渺无边际的沙漠和浓荫蔽日的原始森林,穿越汹涌澎湃的激流险滩,翻越高耸入云的峻岭雪山,饱尝沙漠的酷热和冰雪严寒,在藏宝图的指引下来到了非洲一个原始的神秘国度库库安纳。这里有残酷的人殉制度,有一个拥有一千个妻室的独眼暴君特瓦拉,有像兀鹫一般丑陋诡诈的老而不死的女巫加古尔,还有美丽聪明的绝代佳人弗拉塔。在这片陌生而又险象环生的土地上三位寻宝英雄历尽艰辛。终于在绝代佳人弗拉塔的帮助下在海底深处找到了珍藏这批价值连城宝藏的巨大藏宝洞。然而,在女巫加古尔的精心策划下,一场灭顶之灾正在悄悄逼近。
藏宝洞的洞门十分坚固且洞门紧闭,如果不知道开启洞门的秘密是无法打开藏宝洞的洞门的。在藏宝洞的洞门一侧有一个奇怪的矩形密码阵列。根据寻宝秘笈记载,在密码阵列的每行的左侧和每列的顶端有一颗红宝石按钮。每个按钮都可以向左或向右转动。每向左转动7一次按钮,相应的行或列重点数字都增加一。每次向右转动一次按钮,相应的行或列中的数字都减小一。在矩阵密码列阵的若干个位置镶嵌着绿宝石。只有当所有绿宝石位置的数字与藏宝图记载的密码完全相同,紧闭的洞门才会打开。女巫加古尔早已得知开门的秘密。为了阻止寻宝者打开洞门,女巫加古尔为开门的密码列阵设置了全零的初始状态。试图打开洞门的寻宝者如果不能迅速转动按钮使所有绿宝石上的数字与藏宝图记载的一样,就会启动藏宝洞玄妙的机关,使寻宝者遭到灭顶攻击而死于非命。
您能帮助三位寻宝者顺利打开藏宝洞的洞门吗?
编程任务:对于给出的密码阵列,找到获得正确密码的红宝石按钮转动序列。
输入格式
输入的第一行中有一个正整数T(T≤5) 表示有 T 组数据。每组数据的第一行有 3个正整数 n,m和 k,表示洞门密码阵列共有 n行和 m 列,0<n,m,k ≤ 1000。各行从上到下依次编号为 1,2,……,n;各列从左到右依次编号为 1,2,……,m 。接下来的k 行中每行有三个整数 x,y,c,分别表示第 k 个绿宝石在密码阵列中的位置和密码,x 为行号 y 为列号,c为该位置处的密码。
输出格式
对于每组数据,用一行输出 Yes或者No。输出Yes表示存在获得正确密码的红宝石按钮的转动序列。输出 No则表示无法找到获得正确密码的红宝石按钮的转动序列。
输入输出样例
输入 #1
2
2 2 4
1 1 0
1 2 0
2 1 2
2 2 2
2 2 4
1 1 0
1 2 0
2 1 2
2 2 1
输出 #1
Yes
No
说明/提示
对于 100%的数据,1 ≤ n, m, k ≤ 1000,k ≤ n * m,∣c∣ ≤ 1000000。
Solution
对于每个绿宝石,将他的横纵坐标连边,则对于每个点加或者减就是相当于对所有相邻的边操作。对于每条边都有del[u] + del[v] == w
如果不满足上式,则不合法
满足的话就更新一下del[v]然后扔进队列去bfs
最后判断一下是不是每个点都合法就好了
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
inline long long read() {
long long x = 0; int f = 0; char c = getchar();
while (c < '0' || c > '9') f |= c == '-', c = getchar();
while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return f ? -x : x;
}
int n, m, k, cnt, hd[2005], del[2005];
struct szh {
int to, nxt, w;
}a[2005];
bool vis[2005];
queue<int> q;
inline void add(int x, int y, int z) {
a[++cnt].to = y, a[cnt].w = z, a[cnt].nxt = hd[x], hd[x] = cnt;
}
inline bool bfs(int s) {
while (!q.empty()) q.pop();
q.push(s); vis[s] = 1;
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = hd[u], v; v = a[i].to, i; i = a[i].nxt)
if (vis[v]) {
if (del[u] + del[v] != a[i].w) return 0;
}
else {
del[v] = a[i].w - del[u], vis[v] = 1;
q.push(v);
}
}
return 1;
}
int main() {
int T = read();
while (T--) {
memset(vis, 0, sizeof vis);
memset(hd, 0, sizeof hd);
cnt = 0;
n = read(); m = read(); k = read();
for (int i = 1, x, y, z; i <= k; ++i) {
x = read(); y = read(); z = read();
add(x, y + n, z); add(y + n, x, z);
}
bool ok = 1;
for (int i = 1; i <= n + m && ok; ++i)
if (!vis[i]) ok &= bfs(i);
if (ok) printf("Yes\n");
else printf("No\n");
}
return 0;
}
[FJOI2018]所罗门的宝藏的更多相关文章
- 【LOJ】 #2520. 「FJOI2018」所罗门王的宝藏
题解 发现似乎相当于问一个2000个元的方程组有没有解-- 然而我懵逼啊-- 发现当成图论,两个点之间连一条边,开始BFS,每个点的值赋成边权减另一个点的点权 如果一个环不合法那么肯定无解 代码 #i ...
- 【BZOJ5470】[FJOI2018]所罗门王的宝藏()
[BZOJ5470][FJOI2018]所罗门王的宝藏() 题面 BZOJ 洛谷 有\(n+m\)个变量,给定\(k\)组限制,每次告诉你\(a_i+b_j=c_k\),问是否有可行解. 题解 一道很 ...
- bzoj5470 / P4578 [FJOI2018]所罗门王的宝藏
P4578 [FJOI2018]所罗门王的宝藏 设第$i$行上的值改变了$r1[i]$,第$j$列上的值改变了$r2[i]$ 显然密码$(i,j,c)=r1[i]+r2[j]$ 对于同一列上的两个密码 ...
- 洛谷P4578 [FJOI2018]所罗门王的宝藏(dfs)
题意 题目链接 Sol 对于每个询问\(x, y, c\) 从在\((x, y)\)之间连一条边权为\(c\)的双向边,然后就是解\(K\)个二元方程. 随便带个数进去找找环就行了 #include& ...
- 洛谷4578 & LOJ2520:[FJOI2018]所罗门王的宝藏——题解
https://www.luogu.org/problemnew/show/P4578 https://loj.ac/problem/2520 有点水的. 先转换成图论模型,即每个绿宝石,横坐标向纵坐 ...
- P4578 [FJOI2018]所罗门王的宝藏
传送门 考虑一个位置答案传递性,如果某个位置的红宝石转动确定了,那么会引起连锁反应: 如图,绿色的转动确定了,那么那两个蓝色的转动也确定了 自己手玩一下,发现如果有解那么随便找一个开始然后一路玩下去最 ...
- luoguP4578_ [FJOI2018]所罗门王的宝藏
题意 一个n*m的矩阵,初始值全为0,每一行每一列操作一次可以加1或者减1,问能否操作得到给定矩阵. 分析 行和列的分别的加减是可以相互抵消的,因此我们只需要考虑行的加和列的减. 对于给定矩阵每一个数 ...
- 题解【[FJOI2018]所罗门王的宝藏】
本题解同步于luogu emmm切了近年省选题来写题解啦qwq 该题较其他省选题较水吧(否则我再怎么做的出来 思路是图论做法,做法上楼上大佬已经讲的很清楚了,我来谈谈代码实现上的一些细节 \[\tex ...
- 算法:poj1066 宝藏猎人问题。
package practice; import java.util.Scanner; public class TreasureHunt { public static void main(Stri ...
随机推荐
- appium+python 多设备并行执行脚本【转】
1.ready.py文件 def getport(): aport = random.randint(4700, 4900) # 判断端口是否被占用 while getDeviceInfo.is_op ...
- Queue接口分析:add和offer区别,remove和poll方法到底啥区别
Queue接口: public interface Queue<E> extends Collection<E> { /* * add方法,在不违背队列的容量限制的情况,往队列 ...
- win10系统本地iis或nginx服务器部署vue.js项目
1.前端框架一般依赖node.js,我们首先要安装node.js.请参考: http://www.cnblogs.com/wuac/p/6381819.html to:安装好node.js后npm也安 ...
- python 中问题,包括某些库的问题
*)TypeError: exceptions must derive from BaseException 原因是raise语句没有写好 raise('value must between 0 an ...
- template might not exist or might not be accessible by any of the configured Template Resolvers 完美解决
初学者在maven spring boot web项目中使用thymeleaf 模板,经常会遇到 “template might not exist or might not be accessib ...
- 常用的python内置模块
1.time模块: time模块是普通的时间模块 在python的三种时间表现形式: 1.时间戳: 给电脑看的. - 自1970-01-01 00:00:00到当前时间,按秒计算,计算了多少秒. 2. ...
- json串处理2
请求百度地址坐标:http://api.map.baidu.com/location/ip?ak=y0Yb5ZgGK9blTDbR7Dwh9jGtn6X1YE48&coor=bd09ll&am ...
- SpringApplication到底run了什么(上)
在上篇文章:SpringBoot源码解析:创建SpringApplication对象实例中,我们详细描述了SpringApplication对象实例的创建过程,本篇文章继续看run方法的执行逻辑吧 p ...
- 开发技术--浅谈python基础知识
开发|浅谈python基础知识 最近复习一些基础内容,故将Python的基础进行了总结.注意:这篇文章只列出来我觉得重点,并且需要记忆的知识. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对 ...
- 斐波那契查找(Fibonacci Search)
斐波那契查找 斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的. 在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为F[n](如果要补充元素,则补充重复 ...