11 2018 档案
摘要:题目大意:给你一个n×m的方格,要求你从中选择一些数,其中没有相邻两个数,使得最后和最大 题解:网络流,最小割,发现相邻的两个点不可以同时选择,进行黑白染色,原点向黑点连一条容量为点权的边,白点向汇点连一条容量为点权的边,黑点向周围一圈的白点连容量为inf的边,总权值减去跑出来的
阅读全文
摘要:题目大意:给你n个数,有两个操作: 题解:多人尝试得,现在这道题线段树套线段树过不去,所以我学习了一下树状数组套线段树,线段树只维护值域上的区间和,把树状数组询问部分变成这么多棵线段树相减,这样就可以在线段树上二分了 卡点:无 C++ Code:
阅读全文
摘要:题目大意:问长度为n的Sam数有几个,Sam数的定义为没有前导零,相邻两个数字之差绝对值小于等于2的数 题解:发现转移方程一定,可以矩阵快速幂。 卡点:没有特判n=1的情况 C++ Code:
阅读全文
摘要:题目大意:有一棵n个点的树,和一个费用m,每个点有一个费用和价值,请选一个点,再从它的子树中选取若干个点,使得那个点的价值乘上选的点的个数最大,要求选的点费用总和小于等于m 题解:树形dp,贪心可得选的点一定是费用最少的几个点,可以用可并堆,大根堆,若总费用大于m就把堆顶弹掉,直
阅读全文
摘要:题目大意:求树上最长的异或路径 题解:由于异或具有自反性,只需要求出每个节点到根的异或长度,塞进Trie里,最后对每个节点找一下最大值更新答案即可 卡点:把动态开点写成了可持久化,然后空间要再多开一点(比层数多一) C++ Code:
阅读全文
摘要:题目大意:有一串初始长度为n的序列a,有两种操作: 题解:把序列前缀和,变成S,就变成了在[l−2,r−1]区间内找一个数Sp,使得Sp⊕Sn⊕x最大。可持久化trie 卡点:无 C++ Code:
阅读全文
摘要:题目大意:给你n个点,每个点有权值k,现有两种操作: 1. Bxy:将x,y所在联通块合并2. Qxk:查询第x个点所在联通块权值第k小是哪个数 题解:线段树合并,权值线段树上二分即可 卡点:无 C++ Code:
阅读全文
摘要:题目大意:给一张无向图,找一条字典序最小的欧拉路径 题解:若图不连通或有两个以上的奇数点,则没有欧拉路径,可以dfs,在回溯时把这个节点加入答案 卡点:没有在回溯时加入答案,导致出现了欧拉路径没走环(少走了一段) C++ Code:
阅读全文
摘要:题目大意:一张无向图,问最少设置几个关键点使得有点被覆盖(一个关键点可以覆盖所有与它相连的点),关键点不可以相邻 题解:二分图染色,若不冲突则为较少的一种颜色数 卡点:无 C++ Code:
阅读全文
摘要:题目大意:给一棵树,求其中最大的“毛毛虫”,毛毛虫的定义是一条链上分出几条边 题解:把每个点的权值定义为它的度数减一,跑带权直径即可,最后答案加二 卡点:无 C++ Code:
阅读全文
摘要:题目大意:给定一棵树。有三种操作: 题解:可以发现一条路径对所有不在这条路径上的点有贡献,所以可以把这些区间给排除(树链剖分中的每一条链存下来),把其他位置加上一个数,可以给每个点维护一个大根堆。 考虑删除一个数,可以再开一个大根堆,表示删除的数,若两个堆顶元素相同,就弹出。 卡点:无 C++ Co
阅读全文
摘要:题目大意:给一棵树,路径加,子树求和 题解:树剖 卡点:无 C++ Code:
阅读全文
摘要:题目大意:给你一棵树,有3个操作: 题解:可以在割断时把这条边赋值上1,恢复时赋成0,只需要求p−>q路径和是否为0即可,可以用dfs序+树状数组维护 卡点:LCA越界 C++ Code:
阅读全文
摘要:题目大意:给定一棵以1为根的树,m次操作,第i次为对以vi为根的深度小于等于di的子树的所有节点权值加xi。最后输出每个节点的值 题解:可以把操作离线,每次开始遍历到一个节点,把以它为根的操作加上,结束时把这个点的操作删去。 因为是dfs,所以一个点对同一深度的贡献
阅读全文
摘要:题目大意:一个序列是好的当且仅当有一个数是其它所有数的和,问一个序列可以删掉哪个数变成好的序列。输出所有方案。 题解:发现等于其他数的和的那个数一定是其中最大的,只要排序一下(其实只要找到最大的两个数),就可以O(1)判断是否合法 卡点:无 C++ Code:
阅读全文
摘要:题目大意:给一个长度为n(1⩽的序列S和k(0\leqslant k\leqslant2)个数。 求有多少种S的排列方式使得其任何一个前缀和都不是k个数里的任意一个。 题解:状压DP,枚举当前选的数的状态和下一个数,卡常,枚举下一个
阅读全文
摘要:题目大意:有n个数,q次询问,每次询问[l,r]中最多可以选多少个数使得相同的数最多有k个。(k在同个测试点中相同) 题解:k不变,可以预处理出每个数前面的第k个相同的数在哪,对于询问区间[l,r],若前面的第k个数的位置小于l,则可以选择这个数。于是用主席树
阅读全文
摘要:题目大意:一个全排列,两种操作: 1. 0\;l\;r:把[l,r]升序排序2. 1\;l\;r:把[l,r]降序排序 最后询问第k位是什么 题解:二分答案,把比这个数大的赋成1,否则为0,线段树区间和和区间赋01,最后判断第k位是0是1,若为1则还可
阅读全文
摘要:题目大意:NOIP2018\;TG\;D2T2 题解:在skip2004的博客基础上修改的,也是暴搜。 说明一下把vector改成数组并不可以通过此题,记录。 结论:在m>n+1时答案为3(n,m)((n,m)表示长m高n的矩形的答案) 发现其中判断右下角矩阵斜线全相等的部分
阅读全文
摘要:题目大意:NOIP\;TG\;D2T1 题解:一棵树的很简单,第一个点一定是1,只需要对每个节点,找最小的没有访问过的节点访问即可,我写的是O(n\log_2n)。 考虑基环树的部分,一个显然的想法是枚举一条环上的边,然后删掉,跑树的部分,复杂度为O(mn\log_2n),明显过不了
阅读全文
摘要:题目大意:NOIP2018\;TG\;D1T3 题解:题目要求最短的赛道的长度最大,可以想达到二分答案,接着就是一个显然的树形DP。 发现对于一个点,它子树中若有两条链接起来比要求的答案大,一定接起来成为一条路径,因为接起来答案一定加一,而传递上去的话不一定。然后对于一条链,一定是找可行的最
阅读全文
摘要:题目大意:有一棵树,从中选取2条链,其中任何一条链的端点不能被另一条链包含,求这两条链,使这两条链的公共的点的部分最长,若相同,使得总长度最长。 题解:树形DP,因为端点互不包含,所以公共的部分的端点一定有两个及以上的儿子,然后可以把这样的点先全部求出来。求新树的直径就可以满足第一个要求(洛
阅读全文
摘要:题目大意:给一张n(n\leqslant2000)个点的无向图,给所有边定向,使定向之后存在最多的有序点对(a,b)满足从a能到b 题解:先把边双缩点,因为这里面的点一定两两可达。 根据网上题解得知,最优解一定长这样:存在一个点s,使得对于任意其他点t,要么s可以到t
阅读全文
摘要:题目大意:给你一个长度为n的01串,一次操作定义为:选取3个等距的元素,使其0变1,1变0,要求在\Big\lfloor \dfrac n 3\Big\rfloor+12次操作内变为全0。输出是否可行以及方案 题解:skip1978的博客讲的十分详细。发现给的操作
阅读全文
摘要:题目大意:最大全一子矩阵 题解:单调栈 卡点:果然我还是不会单调栈,长宽写错 C++ Code:
阅读全文
摘要:题目大意:给一个数列,每次询问一个区间内有没有一个数出现次数超过一半。有,输出这个数,否则输出0 题解:主席树,查询区间第\bigg\lfloor\dfrac{len+1}{2}\bigg\rfloor大,并判断它出现次数是否大于$\Big\lfloor\dfrac{len}{2}\Big\
阅读全文
摘要:题目大意:NOIPD2T2宝藏 题解:正常做法:状压DP 。这次模拟退火,随机一个排列,O(n^2)贪心按排列的顺序加入生成树 卡点:没开long\;long,接受较劣解时判断打错,没判n=1的情况 C++ Code: #include <cstdio> #include <cma
阅读全文
摘要:题目大意:维护两个栈,几个操作: 题解:可以平衡树搞,但是也可以用双向链表。两个双向链表,除了第6个,其他都是基本操作。第6个操作时,就把y的栈顶与x的栈顶接起来,把x的栈顶设为y的栈底就行了 卡点:莫名RE了很多次(包括后面WA的),开大数组后通过(我也不知道为什么
阅读全文
摘要:题目大意:给定K,L,R,求[L,R]之间最多不包含超过K种数字的数的和。 题解:数位DP,令f_{i,j}为选到第i个数,已经用了的数字状态为j,令nxt为当前条件的后面的数,$f_{i,j}=\sum\limits_{nxt}(d\times10^i+nxt)(d
阅读全文
摘要:题目大意:维护一个数列,要求在左边插入一个数,在右边插入一个数,查询一个数的排名 题解:可以双指针,开个数组存每个数的位置 卡点:无 C++ Code:
阅读全文
摘要:题目大意:n列箱子,横向消除,一次可以把一行及以上的所有箱子消除,但是一次最多只可以消除k个,求最少用几次把箱子的高度变成一样 题解:贪心,求出比一个高度高的有几个箱子,消除即可 卡点:代码改了一次,结尾处理部分忘记改了 C++ Code:
阅读全文
摘要:题目大意:给你一张无向图,求出删去每个点后有多少个有序点对无法互相到达 题解:缩点,然后找割点DP,非割点的答案为2n-2(有序点对),割点的答案为它各个子联通块大小之积加上2n-2 卡点:无 C++ Code:
阅读全文
摘要:题目大意:一串数字,使用如下方式排序: 先找到最小的数的位置P_1,将区间[1,P_1]反转,再找到第二小的数的位置P_2,将区间[2,P_2]反转,知道排序完成。输出每次操作的P_i,要求稳定排序(在括号外的是多组数据,括号内的是单组数据,四倍经验) 题解:可以用平衡数维护序列
阅读全文
摘要:题目大意:给一个有n(n\leqslant16)个单词的字典,求单词接龙的最大长度 题解:发现n很小,可以状压,令f_{i,j}表示选的数的状态为i,最后一个字母是j的最大长度。 卡点:无 C++ Code:
阅读全文
摘要:题目大意:有n(n\leqslant5\times10^5)个数,有m(m\leqslant5\times10^5)次询问。 一次询问形如l\;r\;s\;k\;w_1\;w_2\dots w_k:每次询问[l_i,r_i]内的出现次数大于一半的数,如果没有,则为s。这次询问后结
阅读全文
摘要:题目大意:有n(n\leqslant2\times10^6)个数,找众数,保证众数出现次数超过一半(内存必须是O(1)) 题解:摩尔投票法。因为众数出现次数超过一半,所以这个众数必然会只有1个。 每一轮投票时,从数组中找出一对不同的元素,将它们删除。如果数组为空,则此时没有任何元素出现的
阅读全文
摘要:题目大意:给你一棵树,每个点有点权,边有边权,求一个点,使得其他所有点到这个点的距离和最短,输出这个距离 题解:树形DP,思路清晰,转移显然 卡点:无 C++ Code:
阅读全文
摘要:题目大意:给一棵n(n\leqslant2\times10^5)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少。输出最少的逆序对个数 题解:线段树合并,对于每个节点求出交换左右子树和不交换的答案。 卡点:没开long\;long C++ Code:
阅读全文
摘要:题目大意:有一种长度为n(n\leqslant 10^{18})的字符串,给定m(m\leqslant10^3)种限制,即字符c出现的次数为cnt,若一个字符有多种限制,则满足任意一个即可,求这种字符串有多少个,所有的cnt相乘小于等于 123,答案对 12345 取模。 题解:
阅读全文