07 2021 档案
摘要:A 因为所有方案的平均价格是一样的所以我们就可以考虑每个方案怎么能被最少地凑出来。 如果是奇数那么肯定要加一变成偶数。然后如果一定能被凑出来。只能输出 code: using namespace std; int T;ll n; int main(){ freopen(
阅读全文
摘要:题面传送门 比原来平衡树多了一个可持久化操作。 我们考虑和线段树一样可持久化,就是对于每个新访问到的点多新增一个节点和原来的版本区别开来。 这里有几个注意事项: 下推标记的时候要可持久化。merge的时候因为split一定已经可持久化过了所以不用新开节点。 时空复杂度 code:
阅读全文
摘要:D1T1 很一眼不能直接LCT维护。 考虑树剖。先看修改。 当我们跳上一个重链时,重链当前点下的点的边权要置为0,然后整段覆盖1和打上时间标记。 在我们查询的时候,重链内部的点肯定是没有问题的,重链顶的点暴力查询时间和链顶上面一个点的时间标记看是不是要计算入答案。 时间复杂度
阅读全文
摘要:游记 这次居然网站没卡好评。 进去先看了1011感觉没有看懂( 后来看到了一堆人切掉了1001就去看1001结果一堆高数内容。就扔给了cqy 然后看到1002发现是个sb题就切掉了。 cqy说1009是AT678然后去看了一下。 发现是sb题就切掉了。 然后去看1004因为觉得很可做,这种最小值一眼
阅读全文
摘要:游记 12:00去开题,然后开了个锤子。 网站疯狂卡崩。 直到12:50才进去。 为什么有的队伍开局6min就切题了啊 看到1011很多人过了就去看。 然后发现并不会( 想了一下决定暴力硬刚,写了个map+队列维护每一层的垃圾玩意,交上去WA了。 然后转眼一看这不直接记搜就好了嘛?我是小丑。 然后发
阅读全文
摘要:Day0 停了一天来训练找手感。 然而ccf说公布地址到十一点还没公布。 写了几道往年的NOI题目希望有用。 Day1 说是8:30开赛ccf总是鸽子。 听说是因为台风所以推迟了,正式赛选手也推迟了。 一直到10:00才开始比赛。 然后题目文件下不下来…… 求助yzx巨佬才拿到题目。 开场发现T1看
阅读全文
摘要:题面传送门 现在来看这种东西真的很屑啊当时我是真的菜。 首先这个欧拉函数很难搞,我们考虑设为和为的方案数。 然后发现其实这个也是所有数或的和为的方案数。 所以枚举一下子集不就可以dp了。 然后因为要保证顺序所以我们强制加入的数最高位递增。 时间复杂度,注意特判
阅读全文
摘要:题面传送门 居然还有这种做法,学到了学到了。 首先这个肯定是有一条分割线,上半边为,下半边为,证明显然。 所以这启发我们跑最小割。 但是这个东西T了一个点。 考虑到这个是一张平面图,可以转化成对偶图然后跑最短路即可。时间复杂度 code: #include<bits/s
阅读全文
摘要:A 容易发现只有进位的时候会出现这种情况。 所以直接输出即可。 code: int T,n; int main(){ freopen("1.in","r",stdin); scanf("%d",&T);while(T--){ scanf("%d",&n);printf
阅读全文
摘要:题面传送门 这么小的,这么大的肯定是矩阵快速幂的节奏。 我们考虑这个边的时间怎么处理。 因为时间是真的小,所以我们可以将每个点拆成个点,然后由每个点的第个点向那边的点连边。 然后这个美食节我们可以拆成段,每一段直接矩阵快速幂,中间乘上特殊矩阵。 然后我们发现这个东西
阅读全文
摘要:题面传送门 这个东西不太会log做法就写了分块算法。 考虑分块。 我们设表示点从后面那个块到块的答案,这个东西可以直接将两块归并得到答案。 同样我们处理出表示点从点前面那个块到块的答案,方法同上。 我们再处理出
阅读全文
摘要:题面传送门 如果我们想求一个矩阵的逆,那么只要将一个矩阵变换成单位矩阵,然后操作矩阵的乘积就是答案。 然后这个过程可以用一个类似高斯消元的方法实现,时间复杂度 code: #include<bits/stdc++.h> #define I inline #define max(a,b
阅读全文
摘要:题面传送门 CCPC也出水题。 我们考虑这种东西怎么做,首先肯定枚举lca,然后变成了统计一个点在子树内的点对的两两lca是当前节点的权值异或和。 如果这个是方案数那么就很好做我们直接dsu on tree统计一下即可。但是这个异或让我们很不好做。 对于这种东西我们考虑拆位。 然后对于每一位分别计算
阅读全文
摘要:题面传送门 这个东西一眼先把提出来然后对于每个gcd只算权值为gcd倍数的答案。 然后这个东西简单容斥一下就是我们要的恰好为当前值的答案。 但是这个生成树权值和怎么做呢,矩阵树定理只能处理生成树权值积。 我们考虑魔改,如果我们将生成树权值积看成个一次多项式相乘,然后取一次项,根据
阅读全文
摘要:题面传送门 很奇怪为什么这么水的题目能到黑题。 因为它有一条到且必须经过的路径,所以我们考虑状压dp出路径条数然后再矩阵树定理。 设为已经经过了集合的点,且最后一个点为的方案数,这个东西是平凡的 然后对于每个,我
阅读全文
摘要:这种选条的东西一般就是wqs二分。 这道题目显然有凸性,然后就可以二分斜率了。 但是这个输出方案很难搞,按照wqs二分分的方案只有90分因为有斜率相同。 我们考虑对每个点维护两个值和表示最小和最大能选的段数。 这个东西dp的时候稍微处理一下就好了。 然后我们对于每一个点,如果
阅读全文
摘要:这个东西正着不太好做我们考虑二分转化成判定性问题。 然后问题就变成:每个物品有一个重量和一个容量,要选取最多的物品且选取一个物品时已经选的物品重量总和不能超过当前物品容积。 这个东西可以反悔贪心,具体地,我们维护一个堆,并将排序,然后得到一个物品时先判断能不能直接放进去,然后看能不能将最大的替
阅读全文
摘要:首先这道题你发现所有异或和不变所以当异或和为时一定平局。 当异或和不为时我们只要考虑最高位即可。 具体的,我们将拥有这个最高位的置为,没有的置为,然后就变成了如何让先手取到的个数为奇数。 这个东西写个dp就可以了。 然后把dp打表输出规律就可以$O(n)
阅读全文
摘要:那个bitset做法是真的屑所以我们考虑更优秀的做法。 考虑分治。 对于一个轴分治,对于两个点在分治线两边的就一定会经过中轴线,我们只要预处理出每个点到中轴线上每个点的连通性然后看看是否在中轴线上有一个点两点均可达。 然后分治下去即可,时间复杂度,但是并没有代码
阅读全文
摘要:题面传送门 这种东西一眼看上去很不可做。 然后想到了fbi的转移矩阵其实是 又因为矩阵乘法满足结合律和分配律,然后就可以用线段树维护区间矩阵加和即可。 时间复杂度 code: #include<bits/stdc++.h> #
阅读全文
摘要:题面传送门 随机化算法没有前途! 我们考虑有什么确定性算法来解决这道题。 询问树上路径就考虑树上莫队,发现拍成欧拉序后可以用一个set维护出现奇数种颜色的个数。 但是这个是的过不去。 我们考虑用分块来维护这个东西,对出现奇数次的点维护一个分块,然后就可以做到$O(
阅读全文
摘要:Day0 中午12:30赶到机房看见没有人以为他们都走了( 然后发现是去吃饭了。 然后13:30就坐上大巴车走了。 车上调掉了两天没过的拉格朗日插值2然后发现是一个小地方没减一。 为什么全局都减了就这个地方没减啊 之后从yzx巨佬那里蹭网,去洛谷比赛写掉了A和B两道题。 和cqy讨论如果E如何快速找
阅读全文
摘要:题面传送门 这道题是dsu on tree的板子题。 我们考虑如果一个子串状压后1的个数小于等于那么就肯定是回文串。 然后两个点之间路径的异或值就是两个点的前缀异或值。 那么直接dsu on tree即可。 dsu on tree的流程大概是先dfs轻子树然后删除贡献,然后dfs重子树保留贡献
阅读全文
摘要:首先这个分的树形dp很好打,直接裸的树上背包合并即可。加了一个每次与子树大小取min的剪枝。 时间复杂度是 然后写了一发过了。 然后再考虑这个东西的复杂度。 首先考虑产生贡献的时候,这个显然是只有次的。 然后如果是小于合并到大于,容易发
阅读全文
摘要:一眼看成分段方式从前到后。 我们先考虑什么情况两个字符集拼出来地字符串会相同,容易发现是两个字符集全等。 这个东西可以用hash判定。 然后我们考虑怎么求出这个字符集。 每次这个块会向右走一个,那么会多一个块再少一个块,然后这个也可以字符串hash维护。 就做完了。之后重排列计数一下即可。
阅读全文
摘要:打表天下第一不接受反驳 这里讲不打表做法吧。 我们考虑枚举一个数算出另一个数的贡献。 然后这个还不太好算我们再枚举一维长度。 我们将所有长度为当前长度的子串加入AC自动机中,并限制一旦走到长度为当前长度的节点就不能走下去。 那么就可以愉快地数位dp了。 时间复杂度大概是 代码就写了
阅读全文
摘要:首先第一问的树形换根dp是很显然的。 首先一次dp算出一个点子树内的答案,然后再一次换根把儿子什么的排个序就好了。 考虑第二个怎么做。 我们考虑到之间的路径,这中间肯定有一条边是不被走到的,然后感性理解一下这个东西具有可二分性。 就是大概要找到一个两边平均的位置。 然后就很好做了。时间复
阅读全文
摘要:这个东西的很小,考虑爆搜。 首先我们对于每层爆搜我们要保证每次搜到的是最优的。 而且我们还要同种的一起处理。 我们考虑对每一层开一个vector,存的是当前搜到的可以作为一个end的位置可重集合。 然后每次扩展肯定是找到这一范围内最小的没被搜过的点进行。这个可以用主席树维护后缀k小值实现。 然
阅读全文
摘要:题面传送门 首先这种题目肯定数位dp,先反手一个差分。 然后有多组询问考虑先全部处理出来。 但是这个限制不太好处理。 然而我们发现这个数字的最大公约数只有,那么我们存当前数模的值和所有值的最大公约数即可。然后这个所有值的最大公约数只有种,可以优化一下。 然后就是
阅读全文
摘要:这个东西分暴力很显然,直接每次询问跑一次树上背包即可。 然后考虑这个随机有什么用 这个东西树高是,每个节点的孩子个数期望 那么每次修改暴力跳修改,然后每次查询暴力跳询问即可。 但是这个东西还可以不依赖树随机,因为最大只有,所以跳层就可以回来
阅读全文
摘要:这个东西显然可以二分。转化为判定性问题。 我们考虑一个答案怎么被判定合法。 首先我们将大于等于的边去掉,然后得到若干个连通块,每个连通块有一个和的总和。 考虑这个有什么充要条件之类的,仔细思考一下会发现就是对于任意都有 这个证明
阅读全文
摘要:图不连通差评。 可以发现这样建边每个连通块只有一个环。 这样的话环上的点可以任意选择。 但是然后如果你正着这样做不是很好做,考虑反过来。求最长上升就好做了,用一个支持撤销的树状数组维护即可。 时间复杂度 code: #include<bits/stdc++.h> #define
阅读全文
摘要:A 这个东西随便特判一下就好了。 code: using namespace std; int n,m,a,x,y; int main(){ freopen("1.in","r",stdin); re int i;scanf("%d%d%d%d",&n,&a,&x,&y);if(n<=a) prin
阅读全文
摘要:题面传送门 这个这么小肯定是拿来状压的。 我们考虑设为仅用种公司生成的树方案数。 但是这个东西不是很好做,我们考虑设一个弱一点的状态:表示用了个公司的方案数。 这个显然可以状压在时间内达到。 然后考虑怎么推出 假设我们$F_{1
阅读全文
摘要:题面传送门 我们将每个点拆成入点和出点,然后每条边入点和出点连边,表示这两个点可以在一条路径上。 那么总的答案就是点数减去匹配数。 输出方案这个东西也很好搞,就是对于每个点找到答案,然后直接并查集维护即可。 code: #include<bits/stdc++.h> #define I inline
阅读全文
摘要:题面传送门 这种强制选的一般就是wqs二分。 我们考虑二分一个数,然后将所有和相连的边加上这个数。 然后跑完wqs二分看看是不是条边,如果大于则增大左边界,反之缩小右边界。 这样时间复杂度是的过不去。 可以发现时间复杂度瓶颈在排序上。 我们每次只对固定的
阅读全文
摘要:题面传送门 这个东西肯定有一个性质。 那么这个性质就是对于每个最小生成树同种权值的边所联通的点其实是一样的。 有了这个结论就很好做了,枚举每个权值然后其它树边缩点,然后跑矩阵树定理即可。 时间复杂度 code: #include<bits/stdc++.h> #define I
阅读全文
摘要:题面传送门 介绍一个结论:无向无权图的生成树个数是度数矩阵减去邻接矩阵去掉任意行列的行列式的值。 然后有权图就是将度数改为权值。 有向图的话需要考虑是内向树还是外向树,内向树每个点权值是出边,外向树是入边。 然后就可以开开心心了。 code: #include<bits/stdc++
阅读全文
摘要:很妙的一道题。 首先我们考虑将所有老鼠都进左边能进的且最优的洞。 然后有些老鼠其实是可以反悔的去选右边的洞,如果设第只老鼠原来连,反悔去连,那么对答案的贡献就是 可以发现这个东西对独立,那么我们用一个堆维护即可。 但是一个洞也可以反悔不去选那个老鼠
阅读全文
摘要:卡常题差评。 首先这个东西我们可以枚举中间那个然后扫描线,那么就变成右边不超过某个值的对左边的逆序对个数这个东西可以直接线段树搞。 但是这样常数大的和*一样,我们考虑换一种方法。 我们枚举第一个点,那么其实后面的方案数就是大于第一个点随意排列的方案数减去三个点连续上升的方案数。
阅读全文
摘要:A 显然对于第个数为最优。 那么直接模拟即可。 code: #pragma GCC optimize(2) #include<bits/stdc++.h> #define I inline #define max(a,b) ((a)>(b)?(a):(b)) #define min
阅读全文
摘要:大下分,没写的题目只能等到回去再写了。 A 这个东西显然是每个数的末位置和初位置的差为2的倍数。 然后对于相同的数随便搞搞即可。 code: #include<bits/stdc++.h> #define I inline #define max(a,b) ((a)>(b)?(a):(b)) #de
阅读全文
摘要:感觉像是一种模拟费用流。 首先这个东西费用的计算式为 拆开变成,这个东西对于两边独立。那么我们维护一个关于的单调上升的单调队列。 对于越往前的位置费用越小,但是流量越小。 那么挨个弹飞即可,然后对单调队列打上整体标记。 时间
阅读全文
摘要:你看到这种东西就想到树的直径。 然后随便口胡反证一下就可以知道就是两种情况:一种是一条是直径,另一条是除去直径后的子树的最大直径,另一种是直径扣掉一段,然后扣掉的两个端点分别向下挂两条链。 第一种情况跑出直径随便处理,第二种情况预处理前缀随便搞搞。时间复杂度 code: #in
阅读全文
摘要:首先如果你做过CSP2019纪念品那道题你大概很快就会想到差分。 因为我们在第一天买进第三天卖出等同于第一天买进第二天卖出,第二天卖出第三天买进。 然后第一问就是对于所有的数加起来就好了。 第二问有一个simple的想法就是统计连续的个数,但是会有单独的情况。 转化一下
阅读全文
摘要:首先你有一个的显然做法:枚举重复路径两个端点,计算重复路径和非重复路径的长度,然后三分最大值即可。 这个东西显然过不去,发现瓶颈在三分上,考虑优化。 发现对于一个固定的重复路径长度,非重复路径肯定越短越好。 那么不就只用三分次了? 时间复杂度就变成了 cod
阅读全文
摘要:你会发现这个东西看上去很玄学。 然后这个你会发现其实和是互不影响的。 所以我们对于每个数的后继都找到然后状压一下看看最大值然后最后将所有加起来即可。 注意如果一个数被算过了那么打上标记不再算。 时间复杂度 code: #include<bits/stdc++.h> #def
阅读全文
摘要:题面传送门 出题人总是喜欢让李超上树( 这个东西显然树剖+线段树。 我们将修改拆成两端,那么上行那一段的直线方程就是 下行同理,那么直接维护即可,时间复杂度,但是那个东西常数很小。 code: #include<bits/stdc++.h> #
阅读全文
摘要:题面传送门 李超线段树的板子。 李超线段树是一种利用了标记永久化的线段树。每个区间存储的是这个区间的露在最上面最大的线段。 但是因为是标记永久化所以这个存储的东西本身就是不严格的。 有了这个定义就很好做了。 我们对于每个线段先拆成logn个扔到线段树对应区间,然后再分别插入。 插入的时候根据定义随便
阅读全文
摘要:看到这种平均数的题目肯定想到分数规划啊。 首先二分一个,然后每个点的点权减去,就变成了对于每个点求树上的包含一个点的连通块最大大小。 这个显然是平凡换根dp首先一边dp弄出子树内,然后再来一次算父亲的贡献。 时间复杂度 code: #include<bits/
阅读全文
摘要:这个东西直接算显然不好算,我们考虑将其中心爆破。 如果我们枚举第三个位置,再枚举第四个字符,那么一二位的方案数是平凡的。 考虑如果时间复杂度允许,我们枚举第五个位置,设中的数量,那么答案就是$S(c,l,r)\times S(c,r,
阅读全文
摘要:题面传送门 看到这个权值计算式直接一脸懵逼。 然后枚举了所有情况发现权值都是 这就要我们令后面那个东西最小。 因为每走一步和是一样的所以根据基本不等式我们要让他尽可能贴近
阅读全文
摘要:lxl的分治都场切了这道题的类分治居然没想到 考虑反着做这个东西。 反着做有一个好处就是可以用并查集处理一个点在一列中最近的两个坏点。 我们发现每次答案增大就是增大包含正在添加点的矩形。 这个东西很好做,我们将正在处理的点的这一行每个点的上下界都查出来,然后枚举左部点,右部用双指针指出分
阅读全文
摘要:考试的时候自己是个sb。 首先对于每个质因数答案互相独立。 然后我们要让有某个质因数的左右都有这个质因数。 那么我们对于一个有个的质因数,要么让这个位置都有这个质因数,要么让其余各处有这个质因数。然后就好做了。 code: #include<bits/stdc++.h> #define
阅读全文
摘要:我觉得这就是个大暴力好吧但是还是比正解跑得快。 首先我们看到形如三个相乘的形式。 这个显然可以拆成8个式子然后分开计算。 这里以三个max相乘为例表明怎么分治计算。 对于没有跨立区间中点的询问,我们递归计算。 对于跨过区间中点的区间,我们对于每个序列双指针出右边对应的前缀max分界
阅读全文
摘要:首先我们考虑这个图的特殊性质。 显然这是个仙人掌树对吧。 我们可以圆方树。 然后就变成了两两方点之间距离,距离定义为2^方点数量。 这个东西线段树随便维护好吧。 就是拆成上下两段计算,上行是永久加入,下行是临时加入要撤销。 时间复杂度 code: #include<bits/st
阅读全文
摘要:题面传送门 不知道为什么题解区的那位大哥要和二分图扯上关系。 直接考虑根号分治。 如果一个集合的元素个数大于,那么直接将这个集合的元素扔到桶里然后枚举每个集合每个元素查有没有哪个集合有个元素。这一部分的复杂度是的。 如果它小于,那么
阅读全文
摘要:题面传送门 大概可以算线段树单侧递归的板子。 这个东西看上去没法修改 我们考虑合并的时候怎么合并。 我们要维护每个区间的最大值和该区间的长度,那么答案显然是第一个区间的长度。 然后对于每个区间,它的左区间的答案肯定能全部选入,那么考虑右区间。 右区间选入的值肯定不能小于左区间的最大值。 我们考虑右区
阅读全文
摘要:题面传送门 hash那个很屑我们不去管。考虑确定性算法。 首先我们要保证区间最大减去最小为 然后如果直接看即可。 否则看是不是的倍数且区间没有重复的数显然是对的。 然后关于区间没有重复的数直接维护前驱即可。 时间复杂度 code
阅读全文
摘要:考试的时候写了个常数大的要命的代码。然后思维复杂度不知道比std高多少。 首先我们知道一个结论:联通块个数等于点数-边数。 点数是平凡的,我们考虑边数。 边实质上是一个三维数点,三只log显然不行。 考虑对边差分,所以有,这样是二维数点两个log有70分。 发
阅读全文
摘要:一眼就感觉这个东西很APIO。 然后就真那道题的弱化版。 首先我们显然处理出每个点往右边跳能跳到哪里出 因为非负所以这个东西显然单调可以双指针指出来。 然后发现我们得到的是一个树形结构。于是愉快地树上倍增即可。 时间复杂度 code: #include<bit
阅读全文
摘要:你会发现这个东西不太好做。 然后你想到它最多只能有的质数为因数。 然后就可以写个爆搜大概是枚举因数。 你发现这个东西复杂度大概是,但是它有多测。 这个时候把表打出来就好了。 code: #include<bits/stdc++.h> #define I inline #defi
阅读全文
摘要:我真是tcl居然没有调出来。 首先套路地拆成上行和下行两端。 先考虑上行,对于一个点如果满足条件那么它一定满足 移项得到 这不是链上数一个数的个数吗,dfs的时候差分询问开桶记录即可。 然后下行也是一样的。 总的时间复杂度时间复
阅读全文
摘要:这个显然是最长上升子序列长度。 考虑怎么求这个东西。 我们设表示在中到了,已经使用了次的在中最大能到达的位置。 然后考虑两种转移,一种是后移,一种是跳到最近的位置。 时间复杂度,然而第二个包最后一个点过不去,特判了qwq code
阅读全文
摘要:首先根据四色定理这个颜色肯定不超过 然后题目中给了的样例是4,然后手推一下到即可。 然后考虑怎么构造。 容易发现除了其它都是奇数。 然后我们对这个东西奇偶染色容易发现上下只要颜色不同即可。 所以上面下面就好了。 code: #include<bit
阅读全文
摘要:题面传送门 其实这道题是一眼秒了的。 因为有正负所以显然按正负开两颗平衡树维护即可。 但是并没有这么简单。 首先,这个要特判。 然后它还会重复撤销一个不等式多次所以也要特判。 大概没了。时间复杂度 code: #include<bits/stdc++.h>
阅读全文
摘要:很妙的题目,考试的时候没做出来我果然是菜。 考虑对这个东西分治。 对于两边的分治下去即可。 然后对于跨越区间中点的特别处理。 对于左边处理出表示内的最大前缀长度,表示内的最大子段和。 右边同理,那么对于一对$(i,j)\max
阅读全文
摘要:我们发现每个值的贡献其实是独立的。 所以这启发我们对于每个值单独计算。 题目中真正有意义的合并只有次,每次暴力归并所以是的。 但是这个显然不够优。 我们考虑启发式合并。 这样再用个set维护就可以了。时间复杂度 用线段树合并可以一只log code
阅读全文
摘要:A 考虑无解的情况。显然为奇数无解,然后在结尾无解。 然后似乎没有其它反例了。 于是就过了。 code: #include<bits/stdc++.h> #define I inline #define max(a,b) ((a)>(b)?(a):(b)) #defin
阅读全文
摘要:A 没什么好说的,就是模拟。 code: #include<bits/stdc++.h> #define I inline #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define abs(x) ((x
阅读全文
摘要:题面传送门 没想到卷积还能做匹配。学到了学到了。 首先我们将反序,这样我们就要和相同。 如果我们将两个这样的设一个权值,那么如果一个数全部加起来为,就是可以匹配的。 我们可以设为 但是这里有通配符。 如果我们把权值改为$A_jB_(A_j-B_)^
阅读全文
摘要:题面传送门 首先爆枚每个数肯定是不行的。 考虑优化,我一开始写的是搜然后判断是否可行。这样的大概是中情况。 然而还要乘个,复杂度铁定爆炸,卡常卡到实在卡不动。 然后发现其实的左右两边是互为相反数的,只要搜一半即可。 时间复杂度$O(nC_{9}{\frac{2
阅读全文