04 2020 档案
摘要:这次题目很简单,但仍然改变不了我没法阿克的命运(还是菜 开题开错顺序(滚粗),把第二题做成了第一题,心想着这次比上次良心于是怀着一种切sb题的思路把给切掉了,然后发现看错题面,之后觉得题面对了以后更了,不就是个线段树维护元素平方和吗,写了十分钟,挂上了一个莫队写的对拍
阅读全文
摘要:题面传送门 考虑像HH的项链那道题一样维护最后一个位置。 如果在第个点设为当前到的答案,那么如果没有平方,显然可以对于每一个最后一个点,将到都加上。查询时区间查询即可。 可现在是平方和,我们知道那么
阅读全文
摘要:题面传送门 考虑一下,其实只要管一个两个倍数点到另一个两个倍数点就好了。 设 贪心一下,发现两个倍数点都赋值就是最优的。 对于任意一个的倍数点,任意一个的倍数点距离他不超过,且必定有一个点在这个位置。 所以就可以根据这个最优
阅读全文
摘要:题面传送门 显然可以数据分治啊。 对于时,珂以跑暴力,单次复杂度不超过 对于,珂以离线对每一个跑一遍的预处理,将所有的处理出来,直接调用即可。每次均摊复杂度 总复杂度$O(n\sqrt n)
阅读全文
摘要:题面传送门 挺入门的状压题。 先枚举状态,然后枚举最后一个合并的是哪一个,状态转移方程: \(f_{i}=min(f_{i-2^j}+\sum\limits_{k=1}^{n}{1[a_k=j]}-\sum\limits_{z=\sum\limits_{s=1}^{m}(\sum\limit
阅读全文
摘要:题面传送门 和HH的项链那道题有点像。 将所有询问离线,按右端点排序。 维护每种颜色最近出现的和第二近出现的。当加入一种颜色时,将其第二近出现的删掉,使原来第一出现的变为第二出现的。 然后来了一个询问,查询比他大的数的个数就是答案,树状数组或线段树或平衡树随便维护一下就好了。 代码实现: #incl
阅读全文
摘要:题面传送门 一道蛮好的区间。 设表示最后一个人从左边进来的方案数,表示从右边进来的方案数,分类讨论一下就好了。 代码实现: #include<cstdio> #define mod 19650827 using namespace std; int
阅读全文
摘要:题面传送门 蛮好的一道题目。 考虑状压。对原数列做前缀和,每一位代表是奇数个还是偶数个。那么前缀和亦或就可以得到一个区间。 对于一个区间,只有亦或和是或时才能构成回文串。那么莫队增加和修改时枚举即可。 注意前缀和要往前一位。 时间复杂度 注意常数不
阅读全文
摘要:题面传送门 题居然还能放这种水题。 这样走只有三种走法。 分别求即可。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n
阅读全文
摘要:题面传送门 貌似弱省省选不咋地。 考虑贪心,折返走要两倍的步数,而最后一次仅需一倍的步数。 首先求出最长链,然后将步数尽量给最长链,剩下的步数给往返走。 注意不能超过。 代码实现: #include<cstdio> #include<cstring> #define max(a,b)
阅读全文
摘要:题面传送门 Ynoi虐我千百遍,我待sjjg如初见 话说真是毒瘤,不开寄存器居然过不去。 这道题前三问可以从小清新人渣的本愿过来,开个暴力乱搞就好了。 主要是第四问。 考虑暴力乱搞(这还要考虑?),那么的时候复杂度将会很高,达到了。 考虑优化。 采
阅读全文
摘要:题面传送门 其实蛮简单的,不应该有蓝题。 只要找到最小的和即可。 但是注意要特判 代码实现 #include<cstdio> #define min(a,b) ((a)<(b)?(a):(b)) using namespace std; int n,m,k,s,tx,ty,a[10
阅读全文
摘要:题面传送门 分做法见这里 正解是线段树+分治。 我们尝试在线段树上跑分治,则维护线段树每个节点的有几个位置没被选两边跑分治就好了。 代码实现: #include<cstdio> using namespace std; int n,sum[4000039],now[1000039],a[10
阅读全文
摘要:题面传送门 分做法参考这篇博客 考虑在分做法上优化。 分是一个一个找的。我们可以用树状数组维护序列为之前有几个位置被占了。 则当时,,这满足二分的性质,所以我们可以二分找位置。 时间复杂度 代码实
阅读全文
摘要:题面传送门 这道题我也是醉了。 先离散化,离散完之后上带修莫队板子求基本上就好了。 啥?你问我带修莫队怎么打? 带修莫队比普通莫队基础上加上一维时间轴。分块大小为,总复杂度为。 那怎么统计呢? 如果这个$m
阅读全文
摘要:题面传送门 题目告诉我们,没有三点共线,所以我们可以容斥。 两条线,相等,即平行。那么我们可以用总可能数-条直线平行-条直线平行。 用来判断平行线。 代码实现: #include<cstdio> #include<cstring> #include<cmath> #
阅读全文
摘要:题面传送门 作为的第一题,还是偏水的。 这题明显是个·构造。 先判无解,则铺不满是无解,铺过头了也是无解。 那么接下来就很好构造了。刚开始让每个区间完全平铺,然后等到每个区间只有一个时,改成一个一个铺。 代码实现: #include<cstdio> using namespace std
阅读全文
摘要:题面传送门 我们可以尝试贪心。 这个问题满足二分性质,即如果 i ...
阅读全文
摘要:题面传送门 考虑用哈希折半搜索来解决。 观察以下原式考虑移项得到,那么两边就可以分别枚举了。 代码实现: #include<cstdio> #include<cstring> #include<cma
阅读全文
摘要:题面传送门 这道题可以用算法来解。啥?你问我是啥? 我们可以尝试着用爆搜来打网络流,可是无疑会 爆搜的慢体现在哪里呢?爆搜走了很多重复的路。 这时算法的精髓就可以出来了。 算法对于每一条边建一条反向边,并满足。这条反向边有着断边和连
阅读全文
摘要:题面传送门 考虑用树形来解。 则设为让节点的子树的叶子节点被封锁的最小值,那么 跑一遍就可以求出答案 时间复杂度 代码实现: #include<cstdio> #include<cstr
阅读全文
摘要:题面传送门 不知道你看没看出来这里有两个链接啊。 题目叫我们求子串,就很容易想到前缀和,异或又是拥有前缀和性质的,所以就可以用莫队来求啦。 记录为这个数出现的次数,那么莫队的前移后移就可以通过来转移。 顺序很重要!! 代码实现: #include<cstdio> #in
阅读全文
摘要:题面传送门 看上去很玄学的亚子。 我们很容易发现,要想最大,要让每次取出的都是一个严格上升的序列,则原问题转换成最少取几次。 那么对于有的一个数,一定要取次才能取完。则答案为区间内最多的数。则变成了求区间众数。 那么可以用莫队求区间众数,开一个数组记录这个
阅读全文
摘要:题面传送门 对于这道题,正着枚举是很难枚举的,但我们可以反着来。 俗话说得好,正难则反。 考虑最小的一个数,则所有数都是大于等于它的,所以它的排位应该是在。 考虑第二小的数,则除了没有其他数小于它,所以我们可以直接找到除了外的第位,它的答案就是
阅读全文
摘要:题面传送门 考虑把两个操作合并,会发现把每个分为一组,会剩下第个。 则我们可以很容易地推出递推式: 则我们就可以很容易地找到最后剩下的位置了。 那么根据位置求数字就很简单了。 代码实现: #include<cstd
阅读全文
摘要:题面传送门 题号好评。 这道题状态不难想,就是设为第个站点换了第次车的方案数。一般的转移方程为空间爆了。 我们注意到,和是两个对称的点,所以我们可以把它对称成两部分,空间减小一半,如果你卡空间
阅读全文
摘要:题面传送门 这道题......真的无语了。 一眼看上去这道题似乎可以状压,只有和两种,然后我手算把样例转成了二进制,准备推转移方程,结果惊奇的发现,这不就是样例的答案吗?接着推了第二个样例的答案,居然也对了。 言归正传,那么我们设为把以
阅读全文
摘要:题面传送门 题目的询问是互相独立的,这一点给了我们思考的空间。 我们可以用单调队列优化多重背包做正反两趟背包,然后对于询问用来拼,其中,取最大值。 代码实现: #include<cstdio> #defi
阅读全文