答辩乱做

发现代码能力太弱了,题目会了也不会写,所以训练。

真的好痛苦。

代码难度,思维难度被评为 \([1,5]\) 间的一个实数。


loj2018

所用时间 代码长度 思维难度 代码难度 罚时次数
2.5h 3.4k 1.5 3 1

观察一下把一个节点单旋上去对所有点深度造成的影响。

以最小值转上去为例,相当于右子树深度不变,该节点深度变成 \(1\),其他点深度全部 \(+1\)

然后这个可以开权值线段树维护,找父亲可以用线段树二分做。

加节点直接考虑找前驱后继,连在深度大的那个的下面即可。

代码比较难调,样例依托答辩。

code


loj2018

所用时间 代码长度 思维难度 代码难度 罚时次数
40min 2.2k 2.5 2 1

把询问离线下来扫描线。

然后先只考虑 \(a_i<a_j\) 的情况,翻转过来再做一次即可。

先考虑 \(p_1\),直接单调栈即可。

对于 \(p_2\),可以发现枚举前面一个满足 \(p_1\) 的点后,前面左端点是一个区间,因此线段树维护即可。

code


loj2028

所用时间 代码长度 思维难度 代码难度 罚时次数
20min 2.4k 1.5 1 0

考虑如果乘法用完了,剩下全部填加减,那么显然除了第一个数后面的贡献都是 \(0\),因此只需要考虑每个前缀积的贡献即可,用线段树简单维护。

code


loj2032

所用时间 代码长度 思维难度 代码难度 罚时次数
2h 3.2k 1 3 1

树剖,然后用李超树维护一次函数,没了。

复杂度 \(O(n\log^3 n)\),用全局平衡二叉树可以变成 \(O(n\log^2 n)\)

code


loj2251

所用时间 代码长度 思维难度 代码难度 罚时次数
2.5h 5.6k 3 4.5 1

容易发现这个树状数组求的是一个后缀和。

所以相当于查询区间 \([l-1,r-1]\)\([l,r]\),所以相当于比较 \(a_{l-1}\)\(a_r\)

因此只需要考虑修改操作对这两个位置可能改变的概率,然后发现可以写成一个矩阵的形式,就是考虑三种情况:区间包含,只包含 \(l-1\),只包含 \(r\),贡献可以简单计算。

套个 cdq,没了。

需要特判 \(l=1\) 的时候,这个时候就是查询 \([1,r-1]\)\([r+1,n]\) 相同,那么相当于是判断总和和 \(a_r\) 相同,维护方法类似。

注意在数组大小很小的时候,vector 的速度非常慢,这题矩阵为 \(2\times 2\),如果开 vector,那么声明一个矩阵所需时间是数组维护的 \(9\) 倍,直接 TLE。

code


loj3957

所用时间 代码长度 思维难度 代码难度 罚时次数
2.5h 5.0k 2 4.5 0

这题 的弱化版,相对简单。

暴力就是个模拟费用流,直接用启发式合并即可。

有加入、删去员工,先来个线段树分治,这样只需要考虑加入和撤销。

费用流模型就是树边流量无穷,然后每个员工流到一个点上,每个点有一条出边。

那么考虑加入一个员工,相当于是先取消之前的一些流向上流,然后再在子树中选一个最小值然后去选择它。

直接树剖维护每条边流量,然后子树去查询即可。

细节很多,而且很难写。

线段树,在判断 l==r 之前不能查询和左子树和右子树相关信息!否则数组要开 \(8\) 倍。

code


uoj783

所用时间 代码长度 思维难度 代码难度 罚时次数
2.0h 3.0k 3 3 10+

考虑去处理每个操作如果满足前面那个,后面那个修改后面产生的一些操作后可以到达的最大值。

后面一个区间可以转移前面的条件是区间有交且满足偏序关系。

cdq 一下,然后可以双指针加线段树维护。

最后处理询问也类似,离线下来一样做即可。

样例好弱啊,调了很久。

标记永久化线段树不会写石锤了,对着个假的东西看了一年不会。

code


Round 1

发现还是搞成比赛形式做好一点。

时间长了一点,中途摆烂了很久,总体来说还是比较简单的。

下次多放点题。

CF1814D *2500

简单题啊,相当于选一个区间,然后把这个区间内的保留下来,至少要保留一个,否则答案直接是 \(n\),因此只需要枚举 \(O(nk)\) 个区间。

但是有些区间不合法,就是可能会内部不存在一个 \(f_i\) 倍数的点。

对于一个点,包含它的区间是连续的,因此找到那几个 \(f_i\) 倍数的点,把不合法的差分扣掉就做完了,注意区间不能有 \(0\)

复杂度 \(O(n(n+k))\)

CF1809F *2500

这题更傻逼,而且好像踩标了。

考虑 \(b_i=1\) 的是优的,那么需要尽量多选。

只需要知道 \(b_i\) 最多买多少就可以算出答案。

那么对于两个最近的 \(b_i=1\) 的两个点 \(x,y\),那么 \(b_i=1\) 最多选 \(\min(\sum_{i=x}^{y-1}a_i,k)\) 个。

然后整个序列的最后一段属于最后一个 \(b_i=1\),最前面的没用。

那么直接开个队列维护一下每个 \(b_i=1\) 后面的和,前面去掉就删掉一段,后面加就直接来。

复杂度 \(O(n)\)

CF1797F *3000

一开始看这个题,woc 只能点分树。

然后发现不太好做。

考虑无修改不用点分咋做。

显然是各统计两个条件的方案数再减去都有的。

单独统计可以直接并查集简单做。

考虑两个都满足的咋做啊,一个套路的想法是建重构树,就是把并查集过程建成一颗树,相当于两个点在两棵树里都是祖先关系,这个可以树状数组简单维护。

然后是修改,因为每次加入最大的,因此满足一个条件的有 \(n+j\) 种,两个都满足的直接查询在一颗重构树上的深度即可。

posted @ 2023-02-22 15:30  houzhiyuan  阅读(35)  评论(0编辑  收藏  举报