
Virtual Judge
Masker_43
这个作者很懒,什么都没留下…
展开
-
【R - Milking Time】
思路:不是普通01背包吗?有两个问题:手推样例就可以发现,如果不对区间 sort,则裸的01背包无法得出正确结果。即使根据右端点排序后进行01背包,可能是对的,但是会 TLE。那么现在为了降低时间复杂度,将对每个点时间的 dp 变为对每个物品(区间)的 dp。又出现一个问题:dp[i] 应该代表 “ 必须使用 i 区间 ”,还是 “ 前 i 个区间可以得到的最优解 ” ?答案:...原创 2019-07-27 22:15:50 · 209 阅读 · 0 评论 -
【L - Connections in Galaxy War】
思路:“带权并查集”(权不变),离线删除、查询离线:结构体存储。将顺序的删除改为逆序的增添,起始图为全部摧毁后的图,再逆序输出答案。还没有AC代码:WA#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <s...原创 2019-07-05 09:49:59 · 190 阅读 · 0 评论 -
【B - The Suspects】
思路:并查集基础题。首先写了BFS,MLE。并查集:令第一个元素为首元,将每组合并,最后查找也比较简单。代码:BFS:MLE#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const i...原创 2019-06-30 10:49:56 · 101 阅读 · 0 评论 -
【C - Monkey and Banana】
思路:最长上升子序列的变种。数字改成了结构体 BLOCK,并且不仅要求出长度,本题需要求出最高的高度。每个 BLOCK 都是无限的,因此每块都可以变成六块。然后按底面的长排序(贪心),正方形 dp 求解。注意 ans 的使用(dp[i] 的意义)。代码:核心:正方形 dp 求解最长上升子序列#include <iostream>#include <algo...原创 2019-07-10 16:37:37 · 233 阅读 · 0 评论 -
【M - 小希的迷宫】
思路:很容易想到是并查集,若新路的两端已经联通,则成环(不符合要求)。但是有坑:首先小希要求 “任意两个房间都有且仅有一条路”,即全图是强连通的。若树根有两个或两个以上则不符合要求。若直接输入 “0 0”,说明迷宫没有房间,符合要求。注意编号不一定顺序,因此要加入 app[maxn]。代码:46ms 1904kB//46ms 1904kB #include <...原创 2019-07-05 11:52:07 · 283 阅读 · 0 评论 -
【N - Is It A Tree?】
思路:和//0ms 1200kB#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int maxn = 1e5 + 5;int T = 0;bool ans;int par[maxn];bool app[maxn]...原创 2019-07-05 12:25:49 · 150 阅读 · 0 评论 -
【C - How Many Tables】
思路:非常质朴的并查集啦,求有几个联通块,最后头为 -1 的元素个数就是呗。代码:0ms 1416kB//0ms 1416kB#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int maxn = 1005;in...原创 2019-06-30 14:50:34 · 153 阅读 · 0 评论 -
【J - FatMouse's Speed】
思路:LIS变种,输出路径,故使用三角形动归比较方便。坑不少,还是做出来了。合并成一句话:因为是倒序输出,想要先输出 w 小(v 大)的;因此要把 w 小的放后边,因此要在 sort 时把 w 小的放后边代码:15ms 1440kB//15ms 1440kB#include <iostream>#include <cstring>#inclu...原创 2019-07-14 23:29:38 · 171 阅读 · 0 评论 -
【D - How Many Answers Are Wrong】
思路:带权并查集,区间统计。带权并查集和普通并查集的区别:Find 函数不可以写递归了,要能够动态更新路径上所有点的 val 。UNION 函数中要改 val[parr],不需要改val[r]。本题注意:题目没说多组用例,自己也要读到文件尾,不然就会WA。区间统计需要变成左开右闭(如此针对:6,6,1 类限制才不会出错)。代码:46ms 2972kB...原创 2019-06-30 16:16:36 · 112 阅读 · 0 评论 -
【A - Wireless Network】
暑假啦,做并查集专题~~~~思路:先预处理把距离合格的电脑之间做上标记。每次修理时可能发生合并。每次询问时,查看是否在同一组中。注意:不加头文件可能会莫名报错。scanf 注意加 getchar。代码:3000ms 1680kB//3000ms 1680kB#include <iostream>#include <cstdio>//...原创 2019-06-29 22:09:57 · 99 阅读 · 0 评论 -
【I - 最少拦截系统】
思路:一:这是一道经典的动归题目,经典在它可以牵引出 Dilworth定理、LIS(Longest Increasing Subsequence)。先说 Dilworth:Dilworth定理包含如下知识:偏序集、链、反链。Dilworth 包括两个对偶定理:最大链长度 = 最少反链划分数。最大反链长度 = 最少链划分数。那如何使用该定理呢?非常简单。以本题为例:求最少...原创 2019-07-14 13:41:52 · 167 阅读 · 0 评论 -
【M - Jungle Roads】
见:A - Jungle Roads 。原创 2019-07-09 16:55:29 · 129 阅读 · 0 评论 -
【N - 畅通工程再续】
思路:最小生成树,Prim。要注意即使是 double,闭区间也是必须写成闭区间的 ( >= )。代码:46ms 1532kB//46ms 1532kB#include <iostream>#include <queue>#include <cstring>#include <cmath>using name...原创 2019-07-09 17:40:59 · 135 阅读 · 0 评论 -
【H - Tickets】
思路:一般动态规划。注意输出格式,%02d,24小时制。代码:15ms 1424kB//15ms 1424kB#include <iostream>#include <algorithm> #include <cstring>using namespace std;const int maxn = 2005;int N...原创 2019-07-13 11:55:17 · 179 阅读 · 0 评论 -
【I - Navigation Nightmare】
思路:二维并查集,水平坐标是一维,竖直坐标是另一维,每维都有自己的par & val。注意一条路同时提供水平和竖直两个维度的新关系。假设询问时间从小到大,不然若每次都重新并查集会TLE。代码:157ms 1940kB//157ms 1940kB#include <iostream>#include <cstring>#include...原创 2019-07-04 15:14:35 · 184 阅读 · 0 评论 -
【J - A Bug's Life】
思路:基础种类并查集。注意输出格式 \n\n。代码:766ms 708kB//766ms 708kB#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 2005;int N,M;bool ...原创 2019-07-04 15:40:03 · 127 阅读 · 0 评论 -
【A - Max Sum Plus Plus】
思路:M子段最大和。动态规划拢共分三步:递推突破口:子段和类问题都是选新数字与不选新数字,选新数字又分为吸附与拓展。状态转移方程:先用正方形 dp 找出原始方程,然后根据条件(本题中是左段右段)找到变量边界,并且必不可少的是:方程中一定有端格是超限的,这时要手动解决。优化:空间开销一般可以缩小到很少的维数。代码:正方形dp:int sum[maxn];int L_...原创 2019-07-09 23:30:45 · 179 阅读 · 0 评论 -
【K - Rochambeau】
思路:带权并查集+枚举。关键在题意:若按照一般做法,当出现矛盾时完全无法判断是关系链上的哪一环导致出错,也就无法确定 judge 的身份。枚举每一个人,认为此人是 judge 时,有关他的所有关系都是不可信的,需要跳过。题目不仅要求出谁是 judge,还要求判断多少条关系后能够确认他是 judge,等价于能够判断所有其他人都不是 judge 的语句数量。所以,EDGE 存边、枚举 ...原创 2019-07-04 19:39:08 · 165 阅读 · 0 评论 -
【B - Ignatius and the Princess IV】
思路:暴力:存储所有数字,sort,其中位数一定是答案。动态规划:取消数组,维护两个变量 cur 和 num。新读入的数如果是 cur,num++;如不是 cur,则 num- -。因为目标出现次数超过一半,所以当目标数全都在一起时,最后也有 num>0;在分散最开的情况下,两两抵消,最后三个数中出现两次的即为答案。故做法成立。代码:暴力:187ms 2544kB//1...原创 2019-07-10 12:03:37 · 102 阅读 · 0 评论 -
【E - 食物链】
思路:基础种类并查集,注意取余,+3 。读到文件尾会 WA,真是 … 。总结:逻辑判断类题,当同属于同一集合(头元素相同)时进行判断;不属于同一集合时,合并。代码:282ms 1116kB//282ms 1116kB#include <iostream>#include <cstdio>#include <cstring>...原创 2019-06-30 16:56:29 · 495 阅读 · 0 评论 -
【A - Jungle Roads】
思路:最小生成树板题。Kruskal(并查集):存储所有边,sort,遍历一遍边即可找出所有应采用的边,因此也可以使用优先队列。不需要 vis[],并查集足矣。Prim(优先队列):类似 Dijkstra,以点态存优先队列,相当于全图最短路,有所不同的是,最短路松弛为 dis[v] = dis[u] + w;最小生成树松弛为 dis[v] = w 。利用 vis[]。可以用邻接表或邻接矩阵...原创 2019-07-06 10:56:21 · 207 阅读 · 0 评论 -
【P - FatMouse and Cheese】
思路:记忆化搜索,注意本代码成立的前提是“He eats up the cheese where he stands and then runs either horizontally or vertically to another location.” 即每次行动时只能选定一个方向猛冲。代码:140ms 1492kB//140ms 1492kB #include &l...原创 2019-07-23 20:45:06 · 163 阅读 · 0 评论 -
【Q - Phalanx】
思路:最大对称子矩阵,一开始就有些思路,搜了下题解发现差不多就直接动手写了,A的好开心。算是枚举吧,其实大部分 dp 都是优化的枚举嘛,本题略有看表填格的影子。dp[i][j] 代表以 mp[i][j] 为左下对角元的最长对称矩阵边长。写法要注意,本代码写的稍微有一点点取巧。代码:2964ms 6344kB//2964ms 6344kB #include <io...原创 2019-07-23 23:47:54 · 365 阅读 · 0 评论 -
【S - Making the Grade】
思路:动态规划+离散化。数据范围过大,需要离散化:A【】是原数组,U【】是去重数组,dp【】是代价。心路历程:令 dp[i][j] 代表前 i 个数符合某规则并且将最后一个元素改成数字 j 所付出的总代价,得到一个 TLE。使用滚动数组,将 dp[maxn][maxn] 改成一维,仍然 TLE。使用变量 PRESUM,降低时间复杂度。注意:两种规则(不升\不降)只需要一次 r...原创 2019-07-29 12:40:09 · 659 阅读 · 0 评论 -
【K - Jury Compromise】
思路:哭了,真难使用了晶之王的方法。dp[i][j] 代表已经选取了 i 个人,且这 i 个人的辩控差为 j 时的辩控和。没有做出来的一部分原因是,好像之前做的动归题都是取表填目前格(背包问题)的,但本题是取格填未来空的。代码:32ms 2024kB//32ms 2024kB #include <iostream>#include <cstrin...原创 2019-07-22 17:33:20 · 175 阅读 · 0 评论 -
【L - Common Subsequence】
思路:之前做过总结了。可以看出滚动数组对时空均有明显优化。代码:47ms 4648kB//47ms 4648kB#include <iostream>#include <cstring>#include <algorithm>#include <string>using namespace std;const...原创 2019-07-22 18:39:21 · 95 阅读 · 0 评论 -
【M - Help Jimmy】
思路:另一种动归思路:从最优子结构入手,属于查表填格的做法。借鉴自_pkm_的BLOG。代码:16ms 728kB//16ms 728kB#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#define INF 0x3...原创 2019-07-22 21:22:14 · 209 阅读 · 0 评论 -
【N - Longest Ordered Subsequence】
思路:LIS,前几天写过啦,N^2,NlgN。代码:N^2:32ms 700kB//32ms 700kB#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1005;int N;int...原创 2019-07-22 21:41:25 · 102 阅读 · 0 评论 -
【O - Treats for the Cows】
思路:新类型:区间dp。dp[l][r] 代表在区间 [l,r] 内可以取到的最大值,注意,我们是从小到大逐步蚕食增大区间的,根据题意,可知在整个过程中是最后取本区间内的值。注意初始化,枚举时先枚举长度,再根据长度枚举起点。代码:47ms 14560kB//47ms 14560kB#include <iostream>#include <algor...原创 2019-07-23 12:04:41 · 194 阅读 · 0 评论 -
【F - Piggy-Bank】
思路:完全背包,做过两遍了。内层循环顺序,因为同样的钱币可以选择多次。代码:62ms 1464kB//62ms 1464kB#include <iostream>#include <algorithm>#include <cstring>#define INF 0x3f3f3f3fusing namespace std;c...原创 2019-07-12 11:56:26 · 134 阅读 · 0 评论 -
【E - Super Jumping! Jumping! Jumping!】
思路:裸的 dp,十分简单,第一次没查题解就顺利做出来了。其实,dp 的关键就在 dp[i] 代表必须使用物品 i,以及 dp 和枚举的综合使用。注意,一旦 dp[i] 代表必须,则 ans 不要忘记。代码:15ms 1420kB//15ms 1420kB#include <iostream>#include <algorithm>#inc...原创 2019-07-12 11:36:33 · 116 阅读 · 0 评论 -
【B - Networking】
思路:最小生成树,点很少,边无界,Prim,邻接矩阵。代码:16ms 708kB//16ms 708kB#include <iostream>#include <cstring>#include <queue>#include <cstdio>#include <algorithm>#define IN...原创 2019-07-06 12:39:19 · 366 阅读 · 0 评论 -
【C - Building a Space Station】
思路:最小生成树,PRIM 。存储所有点,邻接矩阵存图。除了松弛没什么特殊的了。代码:188ms 1028kB//188ms 1028kB#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <cst...原创 2019-07-06 14:27:04 · 191 阅读 · 0 评论 -
【D - Constructing Roads】
思路:最小生成树,已经建好的路 mp 置零即可。代码:282ms 732kB//282ms 732kB#include <iostream>#include <cstring>#include <queue>#define INF 0x3f3f3f3fusing namespace std;const int maxn =...原创 2019-07-06 15:43:32 · 144 阅读 · 0 评论 -
【E - QS Network】
思路:最小生成树,唯一特殊在于 mp[i][j] = w + p[i] + p[j] 。代码:60ms 4244kB//60ms 4244kB#include <iostream>#include <cstring>#include <cstdio>#include <queue>#define INF 0x3f3f...原创 2019-07-06 16:09:50 · 205 阅读 · 0 评论 -
【F - Truck History】
思路:最小生成树,枚举每两串之间的距离即可。代码:422ms 16188kB//422ms 16188kB#include <iostream>#include <cstring>#include <queue>#include <cstdio>#define INF 0x3f3f3f3fusing namesp...原创 2019-07-06 18:55:03 · 126 阅读 · 0 评论 -
【G - Arctic Network】
思路:最小生成树,Kruskal。先分析一波,因为可以任意设置 S 条零花费的道路,那么如果使用单树根的 Prim 恐怕会 WA,应使用以边为本的 Kruskal。一共连 N - S 条边即可,剩下的联通块都使用免费路。枚举所有边,注意枚举严格上三角即可。代码:282ms 2776kB//282ms 2776kB#include <iostream>#i...原创 2019-07-06 23:59:09 · 192 阅读 · 0 评论 -
【H - Highways】
思路:最小生成树。使用 Kruskal 不停 MLE,改成 Prim 才过掉。另有诡异之处,见代码。代码:Kruskal:MLE#include <iostream>#include <cstring>#include <queue>#include <algorithm>using namespace std;co...原创 2019-07-07 14:25:28 · 189 阅读 · 0 评论 -
【D - Doing Homework】
思路:状态压缩 dp。一共十五种课程,我们使用一个整型数的二进制表示已经上过的课程。如000 000 000 000 101(数5)代表当前状态已经上完了第一、三种课程。其实严格来说,我认为它更多的是一种暴力贪心的思想。因为:我们需要依次从小到大枚举所有的状态,每一种状态都只需要使用已经推过的子状态,并且在其中选择当前最优状态更新自身。注意:状压 dp都会用到位运算,位运算必须要一步一括...原创 2019-07-12 11:12:21 · 339 阅读 · 0 评论 -
【G - 免费馅饼】
思路:简单动态规划。两个维度:时间地点,这十分好想,但是先前几秒的位置限制(有些点走不到)十分让人迷惑。那么本题的关键就在倒序计算,如此许多问题迎刃而解。代码:62ms 7292kB//62ms 7292kB#include <iostream>#include <cstring>#include <algorithm>usi...原创 2019-07-12 22:27:03 · 166 阅读 · 0 评论