答辩乱做
发现代码能力太弱了,题目会了也不会写,所以训练。
真的好痛苦。
代码难度,思维难度被评为 \([1,5]\) 间的一个实数。
loj2018
所用时间 | 代码长度 | 思维难度 | 代码难度 | 罚时次数 |
---|---|---|---|---|
2.5h | 3.4k | 1.5 | 3 | 1 |
观察一下把一个节点单旋上去对所有点深度造成的影响。
以最小值转上去为例,相当于右子树深度不变,该节点深度变成 \(1\),其他点深度全部 \(+1\)。
然后这个可以开权值线段树维护,找父亲可以用线段树二分做。
加节点直接考虑找前驱后继,连在深度大的那个的下面即可。
代码比较难调,样例依托答辩。
loj2018
所用时间 | 代码长度 | 思维难度 | 代码难度 | 罚时次数 |
---|---|---|---|---|
40min | 2.2k | 2.5 | 2 | 1 |
把询问离线下来扫描线。
然后先只考虑 \(a_i<a_j\) 的情况,翻转过来再做一次即可。
先考虑 \(p_1\),直接单调栈即可。
对于 \(p_2\),可以发现枚举前面一个满足 \(p_1\) 的点后,前面左端点是一个区间,因此线段树维护即可。
loj2028
所用时间 | 代码长度 | 思维难度 | 代码难度 | 罚时次数 |
---|---|---|---|---|
20min | 2.4k | 1.5 | 1 | 0 |
考虑如果乘法用完了,剩下全部填加减,那么显然除了第一个数后面的贡献都是 \(0\),因此只需要考虑每个前缀积的贡献即可,用线段树简单维护。
loj2032
所用时间 | 代码长度 | 思维难度 | 代码难度 | 罚时次数 |
---|---|---|---|---|
2h | 3.2k | 1 | 3 | 1 |
树剖,然后用李超树维护一次函数,没了。
复杂度 \(O(n\log^3 n)\),用全局平衡二叉树可以变成 \(O(n\log^2 n)\)。
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。
loj3957
所用时间 | 代码长度 | 思维难度 | 代码难度 | 罚时次数 |
---|---|---|---|---|
2.5h | 5.0k | 2 | 4.5 | 0 |
这题 的弱化版,相对简单。
暴力就是个模拟费用流,直接用启发式合并即可。
有加入、删去员工,先来个线段树分治,这样只需要考虑加入和撤销。
费用流模型就是树边流量无穷,然后每个员工流到一个点上,每个点有一条出边。
那么考虑加入一个员工,相当于是先取消之前的一些流向上流,然后再在子树中选一个最小值然后去选择它。
直接树剖维护每条边流量,然后子树去查询即可。
细节很多,而且很难写。
线段树,在判断 l==r
之前不能查询和左子树和右子树相关信息!否则数组要开 \(8\) 倍。
uoj783
所用时间 | 代码长度 | 思维难度 | 代码难度 | 罚时次数 |
---|---|---|---|---|
2.0h | 3.0k | 3 | 3 | 10+ |
考虑去处理每个操作如果满足前面那个,后面那个修改后面产生的一些操作后可以到达的最大值。
后面一个区间可以转移前面的条件是区间有交且满足偏序关系。
cdq 一下,然后可以双指针加线段树维护。
最后处理询问也类似,离线下来一样做即可。
样例好弱啊,调了很久。
标记永久化线段树不会写石锤了,对着个假的东西看了一年不会。
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\) 种,两个都满足的直接查询在一颗重构树上的深度即可。