tg 63

和别人差出来最明显的地方就是没切掉\(T1\)
应该进一步优化做题顺序
不要在想不出正解的时候浪费时间,先做别的

然后就是调题的时间
最近几场发现调题的时间有些过于长了
这里给出的好的解决方案是多输出一些调试信息

然后要注意的是爆内存问题
这种问题是相当致命的
有几次内存开爆直接垫了

讲题

T1

把这玩意拆成两部分
第一部分要求相等,第二部分要求不等
于是考虑这个题[NOI2015]程序自动分析
根据这个题的方式先出一个并查集
无解就是上述方式判出来就行了
然后考虑构造字典序最小解
我肯定是在能选的时候选出最小的
所以在冲突的集合中找出\(mex\)即可

实现的话考虑对于每个位置维护一个vector
表示如果这个位置可以自由选的话,所有在这个位置之前和它冲突的元素位置
由于时限宽松数据范围很小所以可以直接sort然后对着vector找就好了

T2

套路题
首先BFS找到所有连通块
然后对于每个传送门,
考虑从起点连通块向终点连通块连有向边
于是问题就转换成"有向图上两个点是否可达"
然后反手Tarjan缩点建反图拓扑用bitset维护就好了
这种东西确实是一气呵成的

T3

首先维护两个前缀和,后面有用
首先枚举左右端点,单次时间复杂度\(O(n^2)\)
显然理论上只有\(20pts\)对吧,虽然事实上有\(40pts\),
可能是数据结构题数据还没那么强

然后考虑拆分这个询问,拆成两部分\([l,p]\)\((p,r]\)
然后会发现这样一个事情
(记\(a\)前缀和为\(Sum,b\)前缀和为\(sum,\)对于当前询问来说\(a-k\cdot b\)的前缀和为\(S\))
原式\(=Sum_{r}-Sum_{l}-k\cdot (sum_r-sum_l)\\=(Sum_r-k\cdot sum_r)-(Sum_l-k\cdot sum_l)\\ =S_r-S_l\\=(S_{r}-S_{p})+(S_p-S_l)\)
我们发现,这个式子是可以贪心的
离线下来,考虑按\(k\)排序
于是我们只需要对于每个\(Sum\)减去\(\Delta k\cdot sum\),区间查最值就行了
这时暴力是\(O(n^2)\)


上述部分是赛时的思路,
瓶颈在于快速修改上
事实上对于每个点来说修改的东西不一样
所以根本没法上数据结构进一步优化,下面是正解


事实上我们知道\(Sum\)\(sum\)不带修
变化的是\(k\)值,因此我们在\(k\)变化的时候快速维护最大值
\(k\)变化是一次函数,想到直线斜率,考虑凸包
这种东西就直接李超线段树吧?
先忽略这种数据结构的影响
现在我们要做的还是查询区间最值
但是由于断点是变化的没有方法做
考虑让断点变化单调
离线扫描线,于是我们只需要正着做一遍,反着再做一遍就行了
对了,这里应该有李超线段树,不会李超线段树的进

T4

事实上非多项式的暴力很多分,
最后发现根本没时间写,甚至根本没时间看

posted @ 2022-10-10 20:12  2K22  阅读(24)  评论(0)    收藏  举报