[Luogu] 宝藏】的更多相关文章

https://www.luogu.org/problemnew/show/P3959 模拟退火解法 发现prim求最小生成树是明显错误的 因为prim每次要取出边权最小的点 然而在这道T中这样做不一定是最优的 因此可以随机取出点,这就可能是最优 当重复次数达到一定次数时,就极有可能成为最优解 #include <iostream> #include <cstdio> #include <algorithm> #include <queue> using n…
[luogu]P3959 宝藏[TREASURE] 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多. 小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定.…
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根据我们之前状压方程的设计经验,我们很快就能设计出这样的方程: 设f[i][j]表示用到第i个元素,当前连接状态为j的开销的min 但是我们很快就会发现,这个方程没法转移,因为随着连接方案的不同,新插入的点的K值会不同. 怎么办呢? 这时候我们可以重新设计一个巧妙的的状态. 重新阅读题目,我们可以发现…
题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索(是的,这个题用的不叫SA,没有降温). code: #include <queue> #include <ctime> #include <cstdio> #include <cstdlib> #include <cstring> #include…
https://www.luogu.org/problemnew/show/P3959 注意到n非常小,考虑状压/搜索. 发现状压需要枚举起点,跑n次,一个问题是转移不可以以数字大小为阶段了,考虑用dfs的方式递推. 一开始的naive想法是,跑2^n次Floyd,处理出每种联通情况下到根的最少经过点数,然后由N-1状态开始倒着记忆化搜索,出了很多锅,细节也不少. 考虑正着做,即刷表,发现很好写!也不必跑Floyd了,用dis数组一边跑一边更新最短距离就行. f[S]表示联通情况为s时的最小代价…
果真是宝藏题目. 0x01 前置芝士 这道题我是真没往状压dp上去想.题目来源. 大概看了一下结构.盲猜直接模拟退火!\xyx 所需知识点:模拟退火,贪心. 0x02 分析 题目大意:给你一个图,可能有重边,可能有环.让你在这个图上构出一棵树,使得其权值和最小,每条边的权值定义为:这条边的长度 \(\times\) 这条边的两个端点中深度小的那一个的深度.输出这个最小权值和. 于是我们尝试去构造一个序列 \(a\),然后按照这个序列去构树. 按照这个序列构出的树保证第 \(a[i]\) 个结点一…
比较显然的缩点+拓扑排序题,只不过要建虚点优化建边. 首先我们发现在一个SCC里的点都是可以一起对答案产生贡献的,因此先缩成DAG,然后拓扑找最长链. 但是我们发现这题最坏情况下边数会达到恐怖的\(O(n^2)\),因此我们可以对于每种门进行讨论: 横天门:将该点向这个点坐在的格子的横坐标建立虚点并连边 纵寰门:将该点向这个点坐在的格子的纵坐标建立虚点并连边 ZY门:暴力八个方向直接连边即可,(拿map存坐标吧,不会T的) 然后每个点对应横纵坐标的虚点都向这个点连边,这样就可以处理同行/列的情况…
这道题正解是状压DP,不过我不会所以写一下随机化算法来骗骗分. 听说当时考场上就有很多写prim然后挂掉的神仙,其实这道题是可以prim过的 prim是一种基于贪心的算法,在本题中由于盲目的选择当前最优解可能会使得后面的决策不优,于是我们请出基于随机化的prim我口胡的 每一次选择边的时候,有概率的跳过一些对于当前来说最优的边,这样为后面可能跑出更优的解做出铺垫. 这样一次可能得到的解还不如直接贪心得到的解优,但是我复杂度这么小,跑个几千次又怎样? 然后选好随机数种子,满怀信仰地祈祷就可以AC了…
NOIP2017最后一道题 挺难想的状压dp. 受到深度的条件限制,所以一般的状态设计带有后效性,这时候考虑把深度作为一维,这样子可以保证所有状态不重复计算一遍. 神仙预处理:先处理出一个点连到一个集合所需要的最小代价,然后再处理出一个集合连到一个集合所需要的最小代价 设$g_{s, t}$表示从s集合连到t集合的最小代价, $f_{i, j}$表示当前深度为i,挖到集合s的最小代价,有转移: $f_{i, s} = min(g_{s, t} * (i - 1) + f_{i - 1, t})$…
题解 真的想不到这题状压的做法...听说还有跑的飞快的模拟退火,要是现场做绝对滚粗QAQ. 不考虑深度,先预处理出 $pt_{i, S}$ 表示让一个不属于 集合 $S$ 的 点$i$ 与点集 $S$ 联通的最小代价, 也就是从 $i$ 到 $ j, j \in S$的最小距离. 接着处理$ss_{S, T}$, $S\subset T$, 表示从集合$S$拓展到$T$所需要的最小代价. 最后求出$f_{i, j}$ 表示当前已到 深度$i$, 已经扩展到集合$S$时耗费的最小代价. 答案就是$…
BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和这一行可以走到它,如果类型为$1, 2$只要连一条到所在行和所在列的边就可以了,但是类型$3$似乎没有什么好的方法,$map$或者$hash$搞一搞,暴力连一连. 然后缩点之后记忆化搜索一下就可求出最长链了. 点数为$n + r + c$最多不超过$2e6 + 1e5$,边数为$2e5 + $最多$…
记住:map一定要这么用: if(mp[x[i]+dx[j]].find(y[i]+dy[j])!=mp[x[i]+dx[j]].end()) add(i,mp[x[i]+dx[j]][y[i]+dy[j]]); 而不是 R tmp=mp[x[i]+dx[j]][y[i]+dy[j]]; if(tmp) add(i,tmp); 别问我为什么QAQ 建图:选定一个横天门,向在这一行上的横天门连无向边,剩下的门连有向边:纵寰门一样的方法 用map判 自由_门 旁边八个点是否存在,存在就连边: 最后t…
题目链接 想到缩点后DP这题就迷之好做 横天门就点向该行连一条边 纵门就点向该列连一条边 ziyou门直接枚举……map搞搞……话说ziyou门为啥是违规内容不让我发布? 然后缩点,DP,1A 不过写得迷之心累……想装死…… #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #include<cstdlib> #include<map> #d…
来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状态的最小花费 其中j是一个二进制数(用十进制来表示)第i位的1.0分别表示是否已经到达第i点(1表示已经到达,0表示还未到达) (因为m很大,n很小,会有重边,所以用邻接矩阵(e[u][v])) 由此可以列出状态转移方程: f[i][j]=min{f[i][k]+diss[i][k][u]*e[u]…
题目 STO rqy OTZ 首先这种题一看我们就知道可以爆搜. prim一眼假了,但是加个SA也能过. 所以我们来写状压. 记\(f_{i,j,S}\)表示起点到\(j\)距离为\(i\),我们现在从\(j\)开始挖通\(S\)的最小代价. 转移是显然的:枚举\(S\)的子集\(T\)和\(T\)中的点\(k\),挖通\((k,j)\)这条边(如果存在). \(f_{i,j,S}=\min\limits_{k\in T\subseteq S}(f_{i,j,S\setminus T}+f_{k…
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复杂 只是存状态有点难想到 思路 因为n最大为12 所以可以想到是状压 因为n<=12 所以可以用邻接矩阵存下图 枚举每个点作为起点开始DFS 注意每次DFS的初始化和赋值问题即可 代码 #include<iostream> #include<cstdio> #include<…
其实这题吧...有一种玄学解法 这题的要求的就是一个最小化的顺序 那么,我们就不进想到了一种显然的写法 就是random_shuffle 什么?这不是乱搞的非正解吗 然而,正如一句话说的好 一个算法,如果你无法将他卡到错误,那么他就是对的 所以,就产生了下面的科学随机写法 随机化顺序,模拟过程,取ans最小值 code #include<bits/stdc++.h> using namespace std; const int MAXN=20; void file(string s){freo…
题目描述: 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多. 小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定. 在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路.…
tarjan+DAG 上的 dp 难点在于建图和连边,其实也不难,就是细节挺恶心 我和正解对拍拍出来 3 个错误... 传送门:luogu bzoj 题目描述 有座宫殿呈矩阵状,由 \(R\times C\) 间矩形宫室组成,其中有 \(N\) 间宫室里埋藏着宝藏,称作藏宝宫室.宫殿里外.相邻宫室间都由坚硬的实体墙阻隔,由一间宫室到达另一间只能通过传送门.这 \(N\) 间藏宝宫室每间都架设了一扇传送门,没有宝藏的宫室不设传送门,所有的宫室传送门分为三种: "横天门":由该门可以传送到…
虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; ],last,now,sum[],s; deque<lon…
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题目,没有打答案之间的换行,wa了好几次 解决所有"构造"问题都要按照如下的步骤: 寻找特例.特征 建立模型 一般化模型 寻找特例 (1) 我们假设结点数为1,显然答案为0,因为这棵树的边集为空. (2) 当结点数为2时,答案就是d[1][2],即(1,2)的距离. (3) 当结点数为3时呢…
package practice; import java.util.Scanner; public class TreasureHunt { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int[][] walls; float x, y; int doors = Integer.MAX_VALUE, temp1, temp2; int n = cin.nextInt(); wall…
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Status][Discuss] Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti.Ti是一个1~3间的整数, 1表示可以传送到第 xi行任意…
#include <stdio.h> #include <algorithm> #include <string.h> #include <vector> using namespace std; ]; ], v[]; vector<]; long long dfs(int start) { int len; len = Q[start].size(); ) { return v[start]; } ; int i; ; i<len; i++)…
题目描述 Description 小毛终于到达宝藏点,他意外地发现有一个外星人(名叫Pluto).宝藏是一些太空黄金,有n堆排成一行,每堆中有xi颗黄金.小毛和Pluto决定轮流从中取出黄金,规则是每次只能从最左边或最右边取出一堆黄金,直到所有黄金被取出.小毛先取,两人都以最优策略进行选取,求两人的最后所得. 输入描述 Input Description 第一行是正数n(≤500):第二行为n个正整数xi(≤300),表示每堆黄金的个数. 输出描述 Output Description 仅两个整…
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同学们抗议,又与原来的M尽可能接近 输入输出格式 输入格式: 第一行,三个正整数N,M,K. 第2...K行,每行2个数,表示一对实力相当的人的编号(编号为1-N) 输出格式: 一行,表示既不让同学们抗议,又与原来的M尽可能接…
题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品.其中第i个物品有两个属性Wi和Ri,当你选择了第i个物品后,你就可以获得Wi的收益:但是,你选择该物品以后选择的所有物品的收益都会减少Ri.现在请你求出,该选择哪些物品,并且该以什么样的顺序选取这些物品,才能使得自己获得的收益最大. 注意,收益的减少是会叠加的.比如,你选择了第i个物品,那么你就会获…
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti.Ti是一个1~3间的整数, 1表示可以传送到第 xi行任意一列的“横天门”,2表示可以传送到任意一行第 yi列的“纵寰门”,3表示可以传送到周围 8格宫室的“ziyoumen”. 保证 1≤xi≤R,1≤yi≤C,所有的传送门位置互不相同. Output 只有一个正整数,表示你确定的…
Description 进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通. 每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这个房间的宝藏,那么这个房间通往其他房间的门就永远打不开了,也就是说后面的宝藏小火山是得不到了(进入这个房间的门是不会关闭的,小火山还是可以回去的):如果小火山不取这个宝藏,而是去打开通往另一房间的门,那么这个房间的宝藏就会消失, 小火山就得不到这个房间的宝藏. 不过,小火山已经有了藏宝图,知道每一个房间的宝藏的价…
A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小朋友的球 题目:http://www.luogu.org/problem/show?pid=1655 赛中:sb题,第二类斯特林数,加个高精度就行了,我还写了个暴力对拍 赛后:卧槽 怎么只有80 未知错误怎么回事儿啊 C.命运的彼方 题目:http://www.luogu.org/problem/s…