08 2020 档案
摘要:题面传送门 显然是树剖题目,关键是怎么维护不同宗教。 对于每个宗教可以开一棵线段树,但是空间会爆。 所以可以动态开点。 代码实现: #include<cstdio> #include<cstring> #define max(a,b) ((a)>(b)?(a):(b)) using namespac
阅读全文
摘要:题面传送门 二维 考虑设为到达点,还有升油的最小花费。 那么可以拓展出两种状态,即加升油或前往下一个城市。 代码实现: #include<cstdio> #include<cstring> #include<queue> using namespace s
阅读全文
摘要:题面传送门 一道二分图的题目。 考虑将菜向客人,客人向房间连权值为的边,但是这样会有重复计算。 所以将客人拆成两个点,两点之间连权值为的边,就可以达到限制流量的目的。 代码实现: #include<cstdio> #include<cstring> #include<queue> #de
阅读全文
摘要:题面传送门 这道题卡空间卡到了丧心病狂的程度。 两点间路径可以转化为前缀异或值。 对于一般的这样的题目,我们可以直接在一棵上分治,每次选更大的一边,时空复杂度都是 但是这道题卡空间,所以只能用滚动 何为滚动? 可以发现,这道题在某种意义上只有一
阅读全文
摘要:题面传送门 月赛中的简单题。 考虑将原数列以能量排序,那么肯定是前一半匹配后一半最优。 而匹配时优先取被覆盖次数最大的即可判断无解。 但是有一种特殊情况,就是前一半全部指向一个点。 那么把这个点特殊处理掉然后正常做即可。 代码实现: #include<cstdio> #include<queue>
阅读全文
摘要:题面传送门 一道圆方树的板子题。 对于每个点先让它连到环顶。 那么他到环顶的距离就是从两边走的最小值。 那么求两点间距离就可以考虑倍增了。 但是最后要考虑特殊情况 代码实现: #include<cstdio> #include<cstring> #define abs(x) ((x)>0?(x):-
阅读全文
摘要:题面传送门 一眼就是二分图,但是考虑怎么建边。 如果暴力匹配肯定会飞。 卡片上的数的阈值范围很小,可以考虑欧拉筛一趟然后分解质因数。 分解质因数后对于每个质数开一个邻接表,然后对于每一个建边。 建边复杂度就变成了 代码实现: #include<cs
阅读全文
摘要:题面传送门 这是一道基环树直径的题目。 考虑对于一个基环树,只有两种情况:直径在环上,直径在半个环上与链上。 直径在环上直接搞就好了,另一种情况可以单调队列优化dp 代码实现: #include<cstdio> #include<cstring> #define max(a,b) ((a)>(b)?
阅读全文
摘要:题面传送门 这东西有一个更优的复杂度。 显然可以二分,二分以后对每一维尺取后算是的,可以过去。 但是我们发现在第二维尺取时的这一维很没有必要,换句话说,很没效率。 所以就可以用一棵权值线段树代替掉,对每一个点向后个贡献权值。查询时查询最大值即可。 代码实现: #
阅读全文
摘要:题面传送门 仔细阅读题面可知,只有在这个循环矩阵内有连续个斜着的,那么就可以覆盖。 所以这题可以分成两部分:预处理哪些区间可以被覆盖和处理覆盖的最小区间。 处理覆盖的最小区间显然可以单调队列优化dp,设为覆盖到第个且最后一个矩阵右端点在处的最小覆盖数量。那么可得状态
阅读全文
摘要:Day 0 发现很有良心,居然搞赛制,还不用组合程序。 然后,发了密码,感觉好奇怪啊...... 然后晚上又发通知说密码错了...... Day 1 开局看了第一题,感觉题面很长不想做。 然后就跳了第二题。 第二题是求两点间的路径所延伸的路径中的最小值,不过我不会做..
阅读全文
摘要:题面传送门 动态开点线段树水水就过了。 指针版更好写。 代码实现: #include<cstdio> using namespace std; int n,m,k,x,y,z,tot=1; struct tree{int l,r,f,sum;}t[15000039]; inline void pus
阅读全文
摘要:题面传送门 显然基环树dp 对于每个联通块找到环然后强制选和不选累计答案即可。 代码实现: #include<cstdio> #include<cstring> #include<queue> #define max(a,b) ((a)>(b)?(a):(b)) using namespace st
阅读全文
摘要:题面传送门 很毒瘤的一道大模拟。 首先贪心让军队走到最上面的点,如果能走到根节点就停留在根节点下面。 然后查看哪几颗子树没有被封死。 对于有军队的根节点,让能走回来的军队出去调动,反之让其停留在当前节点。 然后就是细节。 代码实现: #include<cstdio> #include<cstring
阅读全文
摘要:题面传送门 线段树离散或者动态开点都可过。 动态开点线段树只要排个序然后区间覆盖即可。 代码实现: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,k,tot=1; struct yy
阅读全文
摘要:题面传送门 我们可以二分这个值。 然后验证时将所有数字减去这个值,看看有没有长度大于权值之和大于的子段就好了。 代码实现: #include<cstdio> #include<cstring> #include<algorithm> #define max(a,b) ((a)>(b)?(
阅读全文