05 2019 档案
摘要:坑点 不记它难解我心头之恨…… WA1:不要读错题Orz,顺序是按它给定的。那就是个类似栈的东西,重点在于输出。 然而我输出很快就模拟对了…… WA2:数据:1 int。我日了不看数据我真的去de模拟的bug了。 WA3:中间栈空是非法。 貌似建一棵树可以迅速搞掉……擦 C++ include in
阅读全文
摘要:转化为质数域上的操作,如果用莫反的话,记录因数的cnt。 其实莫反的推式子最后和容斥做法殊途同归了,容斥的系数就是莫比乌斯函数。 C++ const int maxn = 2e5 + 5, maxa = 5e5 + 5; int n, q, a[maxn], maxx; int primes[max
阅读全文
摘要:关键是check。要注意到其实有了mid以后每个位置都是独立的,它能从哪走到哪是固定了的,只要从左到右尽量贪心压着最小值即可。
阅读全文
摘要:要点 ‘&’操作暗示二进制上按位思考 对于y为1的位,要求x和y之间要至少有两个此位为1的(包含x、y),这样&起来才不是0.而这些位中只要存在一个是ok的即可 dp去求每个x的每个位最早到达的y C++ const int maxn = 3e5 + 5, Log = 20; int n, q, a
阅读全文
摘要:要点 容易想到排序,然后对于每个数: 人的惯性思维做法是:a[i](rank1的+rank2的+…)。然而解法巧妙之处在于直接把所有的加和当成一个系数,然后先假装所有情况系数都是1,接着往上加,树状数组记录着所有之前比它小的数的情况,只有这些小的数也同时存在的区间才会增大它的系数。而且只在乎数
阅读全文
摘要:要点 序列上各位置之间的关系常用连边的手段转化为图的问题。 经过一番举例探索不难发现当存在两条有向边交叉时是非法的。 1是模糊的,也就是填多少都可以,那为了尽量避免交叉我们贪心地让它后面那个连它就行了。 看到一个很简短的dfs做法。从右向左一探到底,不行时回溯,直到可行后再探。
阅读全文
摘要:思路 “恰k个”考虑求至少k、k+1……个容斥 题面说所有数字都不同,可以将所求转化为糖比药多的组数恰为(n+k)/2的方案数 f[i][j]数组我觉得更好的理解方式是"前i个已经安排了j组糖大于药、别的先没管"的方案数 f[n][i](ni)!即为把其它的安排了以后的方案数,但是这
阅读全文
摘要:要点 二分答案,内部喜闻乐见的拖延策略:对于某个打折玩具,就选最晚的打折时间买,答案并不会变劣,只是购买时间的平移。 注意最晚时间不是预处理的东西,是二分内部的、在mid以内的最晚时间。
阅读全文
摘要:要点 各点肯定都在外接圆上,边越多越接近圆面积,所以要最小面积应当取可能的最少边数。 给三角形求外接圆半径公式:R=abc4S。 三个角度对应的圆心角取gcd即是要求的正多边形的一个角度,然后求面积即可。注意三个圆心角的求法是三个内角乘2. C++ include includ
阅读全文
摘要:思路 不难想到枚举l,那如何高效求出最小的r?这样答案加上xr+1即可。 如果l并没在序列里出现……没啥想法;如果l是序列里的数,我们可以做的事情是记下每个数出现的每个pos。观察可以发现如果某数小于l且在序列里出现过,则它不会被删,则:它的区间内所有跟它不同的数得都删掉;
阅读全文
摘要:学到的东西 不知道gcd时不妨先假设为d,然后为了满足全部式子说不定可以得到d的取值范围。 幂上带幂考虑欧拉定理的使用。 有几个特殊情况会破坏公式的完美不要紧,看看特殊情况是否能简便地判定。 连乘公式,证明方法是右边分母乘到左边就都消了: C++ include include include in
阅读全文
摘要:要点 有不等式$x^ay^bz^c=a^ab^bc^c(\frac{x}{a})^a(\frac{y}{b})^b(\frac{z}{c})^c int S, a, b, c; int main() { scanf("%d%d%d%d", &S, &a, &b, &c); if (a + b + c
阅读全文
摘要:逗号空格是假的,全都直接连边就行。 提供一个迪杰n次的图上最小环板子。
阅读全文
摘要:要点 题意是:以颜色red举例,逆时针找最近的,顺时针找最近的,相减得到val;对三种颜色都做这事然后求和,卖掉最小的,更新,继续。 360度很小所以就像365天一样可以暴力前后扫。每次更新最多6个所以就是模拟题了。
阅读全文
摘要:因为公用一个系统所以大家求gcd;衡量各点之间的拓扑位置,如果到达同一点有不同的长度则取gcd。 C++ include include include include using namespace std; const int maxn = 1e5 + 5; int n, m, ans; int
阅读全文
摘要:自从开始写上古场以后我就不断地写A、B题的题解了??? cf problem183A 无论每轮有哪几种选择,最后的可能结果放在一起一定是个钻石型,最后答案就是长方形长乘宽。 非常神奇的性质,如果走了either左or上(或者either右or下),会在45度方向拓展1个单位的宽度;反之右上或左下就会
阅读全文
摘要:要点 题目传送 题目本质是每个点必属于两个集合中的一个,伴随的性质是:如果一个人说别人true,则他们一定属于同一阵营;如果说别人fake,一定不属于同一阵营。 每个点拆为i和i+n分别代表他属于某种阵营(目前还不确定),然后根据上述性质边读入边合并同类。 这样扫一遍,如果某个i和$
阅读全文
摘要:题目传送 dp是常规的;m2的预处理:把位置存进vector然后O(1)算出想要的;WA点:要注意特意设置一下 ,即全天都放鸽子则花费时间为0. C++ include using namespace std; int T, n, m, d, ans; int val[205][205],
阅读全文
摘要:题目传送 思路是始终维护西瓜数量的区间,即L代表目前可以达到的最少的,R是最多的,然后判断一下。 C++ include using namespace std; const int maxn = 1e5 + 5; int T, n, m, a[maxn]; int main() { for (sc
阅读全文
摘要:要点 一开始dp然后码力太辣鸡并且算法带假于是调了很久一交还WA在28…… 吐槽完毕。后来想拿栈优化dp时发现其实完全不需要dp,贪心选取即可,当前的不兼容就干脆不要它了,结果不会变差。然后想要什么就预处理什么即可。 C++ include include include include inclu
阅读全文
摘要:要点 主要学到的东西:一个序列染色,相邻不染同色,恰用j种颜色的 1.模式数 、 2.方案数 、 3.具体染色数 。 从大的思路上来讲:先dp预处理出每一层的模式数:f[i][j]表示i个位置恰染j个颜色的 模式数 ,然后再dp出各层之间的转移:dp[i][j]表示i层恰染$
阅读全文
摘要:要点 结论:如果坐标系一堆点两两对称于某一重心,则排序后第1个和第n个为一对,以此类推。 枚举所有可能的重心点并check。因为隐藏的点不超过k个,所以点1~k+1都可能跟第n个匹配。对右侧同样适用,因此枚举的点是k2的。内部只要两边开始扫描,如果匹配不是当前重心则说明他俩不是一对,则加一个虚
阅读全文
摘要:要点 跟大家打acm的策略一样,为了做更多的题数肯定做最简单的题目,为了罚时更少肯定从易到难做 虽然有个12:00之限不同于往常比赛,但细想还是要从易到难贪:做这些题的总时间肯定是不变的,只是顺序可变,也就是最后交题的罚时是固定的。12点以后是跟正常比赛一样的,这样如果把简单的题换到12点以后反而有
阅读全文
摘要:要点 我在想贪心是对的那要二分图何用,自己的想法是:二分图最开始并不知道怎么匹配最好所以就按输入顺序连了,之后慢慢修改;而这道匹配也成对匹配但从一开始你就可以知道选哪个最划算,就是贪心地选最小的。不必考虑有没有可能最优答案是这个人不穿而让给别人,因为这俩人谁穿都一样,贡献都是1.
阅读全文
摘要:要点 可以贪心选数量最多的那三个构造 二分的话里面的check我不太会。正解是既然当前答案为k个,那每个物品最多只会出现k次,多余的丢掉,剩下的总数如果大于等于3k则true。最后输出答案时也是小小技巧吧,用1,1+k,1+2k组成一组,因为多于k个的都删了所以这三个一定不同
阅读全文
摘要:要点 题意读好久。大概这样理解:每个时间点按顺序收到序号1~n的卡片,只有收过的卡片才能发给别人并且主人公会发在他心中优先级最高的。由于主人公可以在任何时间给朋友发卡片,最后输出(说得很绕但等价于)1~n号朋友最好可以得到什么类型的卡片。 枚举时间点并看当前主角的最大优先级卡片是什么并给大家发,然后
阅读全文
摘要:要点 懒得打公式了,题解 把题目要求的复杂公式化简成熟悉的东西,一是看穿前面加个n!化为Cin,i为奇数;二是将奇数的条件去掉的数学技巧。 形为(a+b√B)n的快速幂 C++ include include include using namespace st
阅读全文
摘要:要点 dp[i][j][k]表示主串已经到第i位时,s匹配在j位、t匹配在k位的最大得分 本来就要试填一层循环,如果转移也写在循环里的化复杂度承受不了,于是开两个表kmp预处理一下。 C++ include include include using namespace st
阅读全文
摘要:要点 ~~这是一道蔡队题,看我标题行事~~ 任意询问y串上有多少个x串,暴力找每个节点是不是结尾肯定是炸的,考虑本质:如果某节点是x的结尾,根据ac自动机的性质,x一定是此(子)串后缀。又有每个Trie节点的fail只指向另一个节点,故有fail树的概念。问题就变成了 “对于串x的尾节点,在fail
阅读全文
摘要:要点 并没问具体方案,说明很可能不是构造。 思考不断读入这个文本串,然后中间不出现某些文法的串。啊,这就是个自动机。 将不合法串使用ac自动机构成一个Trie图,我们需要的字符串就是在这个自动机上无限走路但是却不会撞到危险节点。 这样只要从根开始跑dfs判有环即存在答案。 注意还要加上ac自动机的性
阅读全文
摘要:要点 非要先来后到暗示多源最短路,求最小的最大值暗示二分 二分内部的check是关键,dp处理一下,dp[i]表示第i笔订单最早何时送达,如果在ddl之前到不了则return 0。我觉得其中time变量的维护很好地使复杂度降了一维。 第一发WA点:算法看了一遍感觉没有可改的,就把二
阅读全文
摘要:要点 处于什么位置的题常用一个套路就是搞完[l,r]以后处于0(l)或1(r)的状态,即dp[i][j][0/1]。 对于此题dp意义为已经搞完[l,r]的时最小的已耗电能,转移:以在i处为例,只会是i+1处直走过来或者j处掉头过来两种。写就很好写了。 C++ include
阅读全文
摘要:常规线性dp,需要时就加一维。dp[i][j][t][s]表示在点(i,j)时瓶子里剩t且为s走(0代表小a,1代表uim)时的方案数。 de了半天发现是初次尝试的快速取模少写个等号……然鹅改了以后为什么比正常写跑得慢…… C++ include const int mod = 1e
阅读全文
摘要:要点 因为当前最大字符只有一个且两边是回文的,所以如果答案包含最大字符则一定是重合部分。 若不包含,则用此字符将两个区间分别断为两部分,则共有四种组合,答案一定为其中之一。 C++ include include using namespace std; int l1, l2, r1, r2; in
阅读全文
摘要:要点 标签是dp但搜索一发就能过了。 因为是对称矩阵所以试填一下就是一个外层都填满了,因此搜索的深度其实不超过5。 显然要预处理有哪些素数。在这个过程中可以顺便再处理出一个vector:re[len][number],表示前面已经填了长度为len的数为number,那么最后会合法的填法应该在后面
阅读全文
摘要:方法一 设fi为最多使用i种颜色的涂色方案,gi为恰好只使用i种颜色的涂色方案。可知此题答案为gk。 根据排列组合的知识不难得到fk=∑ki=0Cikgi。 根据二项式反演的式子 or 容斥原理,有$g_k = \sum_{i = 0}^
阅读全文
摘要:我读题有问题呀,题目中到底哪里保证数据一定至少是2倍关系了Orz……然后既然题意就是保证了那贪心一下即可,因为如果当前这个大的不选,那剩下一堆逐渐小于上一代的1/2的,凑起来都不如这个大的,更别说答案了。 Java / @author alphawa / import java.util. ; im
阅读全文
摘要:要点 $\sum{w_i} rhs.w; } }a[maxn]; int dp[maxw]; int main() { read(n), read(d); rep(i, 1, n) { read(a[i].l); read(a[i].w); read(a[i].h); } sort(a + 1, a
阅读全文
摘要:用每个人的血量作为状态去搜索T飞,考虑题解中更好的搜索方式:每种血量有多少个人作为状态。这样会减去很多重复的状态,因为只要乘一下就得到了所有相同情况的和。 虽然我不会算,但是直观感受起来复杂度比较优秀。 C++ include include using namespace std; typedef
阅读全文
摘要:看样例然后发现只要求一个一笔画即可,用板子。 C++ include include include include include using namespace std; const int maxn = 1e5 + 5; int n, b[maxn], c[maxn], _b[maxn], _
阅读全文
摘要:要点 优质题解 因为只有某type坏人全部分布在同一撇时,才能一次消灭。所以题目安排完毕后一定是type(x)和type(y)占一半,其余占另一半。 实际情况只有52 52种,则预处理答案 枚举某两种,并连续两次使用退背包得到无排列的方案数,真·答案是有排列的,乘上一个排列数即可,而根据式子,排列数
阅读全文
摘要:要点 寻找最多边的匹配的结论:贪心地从叶子开始找,最后答案都是奇数层下边的那条边。 设dp[i][j]表示当前长度为i,平衡度为j,平衡度为 数量减去 数量。 增加左右括号转移,并将奇数层合法的加到ans中。 C++ include const int maxn = 1005, mod
阅读全文
摘要:1.只停留于板子的splay:普通和文艺平衡树 2树剖模板:洛谷3384 3.莫比乌斯反演,推公式很重要,预处理mu及其他函数值、整除分块是很惯用的手法:莫比乌斯反演题目结(上)
阅读全文
摘要:有时间有心情~~(那就是没有)~~就逐渐回顾一下写题的过程中学到了哪些手法。 对于新手来讲每个技巧都是新奇而精妙的。 就按照 这一栏的题目顺序来吧。 1.拓扑序上无环的判定及拓扑序上的dp,cf 541div2D 2.两种关于并查集的手法:1.开虚点的并查集,后来在西北大学校赛题解中才知道是带删除的
阅读全文
摘要:要点 题意……题意往往是个大坎Orz:输入操作 则在区间[x1,x2]插入一个三次函数, 则先查询区间[x1,x2]的函数值的和,然后按题目要求得到新的x1、x2并插入一个三次函数。都是整形。 解决方法:三次函数只有四个部分,栽4棵代表不同次幂函数的线段树即可,这样每次只
阅读全文
摘要:要点 题意:两个数据传输数列,每个数列里有若干个数据包并给出发出时间t,每个数据包到达的时间T是$t include using std::vector; typedef long long ll; const int maxn = 5e4 + 5; const int mod = 1e9
阅读全文
摘要:分治的时候SZ感觉是错的……但是貌似第一次找好重心就够了,之后SZ别太离谱就不会T,重心随一随缘就好…… C++ include include include using namespace std; const int maxn = 1e4 + 5; int n, k, mx, SZ, ans;
阅读全文
摘要:dp[v][k]代表以v的子树为起点,以点v为终点长度为k的方案有多少种。 转移只需将子树加和;计算ans由两部分组成,一是dp[v][k],另一部分是经过v的方案数。 C++ include include using std::vector; const int ma
阅读全文
摘要:要点 设f[i][j][k]为 经过点(i,j)且包含点集k 的最小代价,其中k是指景点集合的枚举。 考虑有两种情况:1.点(i,j)作为关键点连接了两个子集时f[i][j][k]可以得到最小,有$f[i][j][k]=f[i][j][k_1]+f[i][j][k_2] a[i]
阅读全文
摘要:AC通道 要点 思路:题解中将所求进行转化max{相似度}=max{M不相似度}=Mmin{不相似度}因此转化为求某01串T与所给众S串的最小不相似度,而最终答案是选取最小不相似度最大的那个。 方法:转化后就可以运用广搜得到所求,即从起始串开始修改某一位,第一次得到此
阅读全文
摘要:最小平均值的环。二分答案以后根据式子将问题转化为:每条边减去mid后是否存在负环,若全是正环说明ans给小了,存在负环则说明存在一个更小的ans。 get到一个新的判负环手法。
阅读全文
摘要:二分答案,内部01背包一下重量大于等于W的最大价值是否大于等于0了。
阅读全文
摘要:本是POJ2976,喜闻乐见的01规划入门题。POJ日常假死,到ZOJ测。 二分答案。 试了试数据好像没问题,ai总是小于bi且最终预答案l都小于1。然而为什么我把r设成1e10往上就会WA,设成1或者1e3会AC,设成1e2会WA……而且网上题解基本都会被全0的数据hack啊……求解答
阅读全文