10 2020 档案
摘要:题面传送门 看完了题目你会发现这道题居然没有撤销操作。 那么基本上就是某些奇奇怪怪的算法 首先我们考虑暴力 第一种想法是暴力对于每个红点求 第二种想法是对于每个新加进来的红点做一遍然后每次查询直接 一般这种有两个暴力然后分别两个操作复杂度大大低于另外一个的就是根号分治
阅读全文
摘要:题面传送门 显然树形 转移时直接考虑这颗子树选或不选。 代码实现: #include<cstdio> #define beg int cur=s.h[x] #define end cur #define go cur=tmp.
阅读全文
摘要:题面传送门 首先考虑一个结论:将一个区间中的数去重后这个区间没有影响。 所以我们只要求出那些中有几个数。 一个区间的条件是区间没有且区间有到。 考虑对于同样的数分段。 那么对于每个段这样查询即可。 即满足两个条件:$[l\leq i \leq
阅读全文
摘要:题面传送门 这道题显然是对于每个卖出股票,在前面找到最小的买进,统计答案即可。 代码实现: class Solution { public: int maxProfit(vector<int>& prices) { int a[1000039]; int i,j,ans=0,tot=0; int n
阅读全文
摘要:初赛: Day 0 考前摸了一下,这样就能考满分了。 然后又膜拜了一下 打了一场就睡觉了。 这场真的打击信心,题交了发才过。然后喜提切了5题中的最后一名。 预祝明天 Day 1 考前进场前膜拜了机房所有人。 考试时发现提高
阅读全文
摘要:题面传送门 不小心抢了个最优解,比第二少了 分块+根号分治套路题。 看到这种跳着加的就知道是根号分治了。 对于的直接加,用分块维护。 对于的,维护数组表示跳个,从开始加了几次。为了之后统计方便,还要前缀和。 统计时,一部分是分块直接统计。
阅读全文
摘要:题面传送门 一道好题。 首先有一个操作:如果有个,个,那么可以通过次变成个 那么考虑倍增,每次选取两块拿来合并。 然后对于前一部分和后一部分分别倍增就好了。 代码实现: #include<cstdio> using namespace std; int n
阅读全文
摘要:题面传送门 首先有一个结论就是不存在二次变换。 如果存在二次变换,那么二次变换那个点的至少一个方向会新出现一个点,但是要新出现一个点那个方向必定原来就存在一个点。所以不成立。 那么就可以从上到下做扫描线,当碰到一列最上面的点时给树状数组那个位置加一,最下面减一就好了。 代码实现: #include<
阅读全文
摘要:题面传送门 这道题暴力dp是很好想的。 就是分别从上一天,最晚可转移的天,凭空买来转移。 因为有状态自然叠加所以只要转移最晚可转移的天就好了。 然后会发现这个是可以正反两边单调队列优化的。 复杂度 代码实现: #include<cstdio> #include<cstring> #de
阅读全文
摘要:题面传送门 一不小心抢了最优解。 首先跑出到所有点的最短路,因为那个梗在先,所以用堆优化dj 然后这道题显然要让我们求最小瓶颈路之类的东西。 所以就可以建出克鲁斯卡尔重构树。在树上倍增。 同时处理子树内距离最小值。倍增到的那个点的值就是答案了。 代码实现: #include<cstdio> #
阅读全文
摘要:题面传送门 考虑暴力建分层图dp 实际上就是对于每个时间建到下一层的图就好了。 然后停留就是自环,爆炸就连向永远走不出来的点。 其实这个东西是可以矩乘优化的。 然后复杂度就降到 代码实现: #include<cstdio> #define mod 2017 using nam
阅读全文
摘要:题面传送门 一道套路题。 考虑把图分解成链与环。 然后我们会发现其实路径就是一条链加上一堆环。 因为从链走到环的路径会被异或两次为 所以就直接上线性基就好了。 代码实现: #include<cstdio> using namespace std; int n,m,k,x,y,flag[1000
阅读全文
摘要:题面传送门 首先用两颗线段树维护每个点所在的亮灯联通块。 然后再建一颗二维线段树,每个点表示到当前为止,有多少个时刻能从到。 对于每次修改,依靠两颗线段树维护的区间,来修改。 这里有一个小技巧,在修改时加上,修改时减去,就是答案,还能累加。 查询就查当前点就好了。 代码实现:
阅读全文
摘要:题面传送门 可以算一道线段树维护hash的模板题了吧。 hash要满足两个条件:相同的数hash值一定一样与hash冲突尽量少。 这道题hash序列可以用幂次方来hash 然后用线段树随便维护一下就好了。 代码实现: #include<cstdio> #include<algorithm> #def
阅读全文
摘要:题面传送门 数据太大了,所以要hash。 多取几个模数正确性更高。 代码实现: #include<cstdio> #define mod 1000000007 using namespace std; int x,y,z,n,m,k,head,ans[100039],fff; long long t
阅读全文
摘要:题面传送门 场切的题目,感觉还是很套路的。 这种最大最小一看就是二分没跑了。 考虑二分分出来后怎么验证。 题面已经很明显地提示了我们这是一张二分图。 那么跑网络流的二分图最大匹配就好了。 时间复杂度 代码实现: #include<bits/stdc++.h> u
阅读全文
摘要:题面传送门 场切的题目,感觉不错。 首先有一个结论:一个质数,只有出现是他才不孤独。 证明: 对于不是的倍数,那么三个值分别为,这样一定无法构成三角形。 对于是的倍数,那么三个值分别为也构不成三角形。 第二个结论:合数一
阅读全文
摘要:题面传送门 你会发现这道题和LNOI2014某题很像。 但是那个次方很难处理。 考虑的情况,就是那道题。 照样差分,但是这次差分不是那么差,而是每个点的权值改成这东西就可以实现了。 因为加到一个点时这个点到根节点的路径都会被加。而这个值又恰好等于深度
阅读全文
摘要:题面传送门 一道典型的树剖题目。 这东西如果暴力肯定是没法算的。除非能转化一下,比如算贡献。 然后会发现HHHOJ上有一道题和这个很像。 这样的话可以把每个点向上算贡献,一直加到根节点。 这样当一个点加到时那么就自然算到了贡献。 其实质是差分,只不过没那么明显罢了。 这个东西可以用树剖+线段树
阅读全文
摘要:题面传送门 首先你可以把所有直径求出来然后暴力。 但是这道题可以把求树的直径的方法。 首先求出一条直径,把直径上的所有点点权减一。然后再求一遍,两次相减就是答案。 正确性显然。 代码实现: #include<cstdio> #include<cstring> #define max(a,b) ((a
阅读全文
摘要:题面传送门 启发式合并大法好! 你会发现这道题可以暴力合并。 然而数据稍微用心一点就卡掉了。 然后你可以试图优化一下,比如合并时把小的合并到大的上面去。 结果就过了。 这样复杂度上界是,具体证明在这篇题解里有。 代码实现: #include<cstdio> #include<cs
阅读全文
摘要:用脚找一下规律就会发现可以构成最后一项为全部异或和的循环节。 那么前缀异或就好了。 代码实现: #include<cstdio> using namespace std; int n,m,k,z; long long a[1000039],q[1000039],ans,x,y; int main()
阅读全文
摘要:当然这道题可以跑最小生成树。 但是那样时间复杂度是,可以被卡掉。 这里有一个跑不满的 就是每次拿到一条边,就搜索是否联通。 不连通就加上去 联通就找到最大的那条边,看看能不能替换,能换就换。 代码实现: #include<cstdio> #include<cstr
阅读全文