记录一下这次让人哭出来的考试吧
上手看 (T1),联想到了CF的一个三分题,发现式子拆出来并不会算,就先弃了
然后看 (T2),数据结构呀,那肝吧,前缀和啥的都挺套路的,过了一会知道了这个是个二维莫队
然后写了一个小时,发现矩形转移写不出来,最后又花了一个小时写了个不知道是啥东西的爆零程序
然后看了一眼 (T3) 发现是个维护拆边直径,(O(n^2)) 看了看就会了
最后时间码上了 (60)
结果都挂了,爆零了
考试的时候还是不能死磕,而且简单题也一定要打对!!!!
自己会不行,到手的分数才是真的
蔬菜
二维莫队即可
高维莫队的排序应该还是按照所有的维来排
考试的时候更新这里想得不是很清楚
(然后整场就无了)
其实想得已经差不多了
先把某一维缩进去,这时候的添加和删减都是直接对着另外几维的当前值来的
然后对着这一维更新即可
具体:
while(l2<q[i].y1) del(l2,l1,r1,1),++l2;
while(l2>q[i].y1) --l2,add(l2,l1,r1,1);
while(r2>q[i].y2) del(r2,l1,r1,1),--r2;
while(r2<q[i].y2) ++r2,add(r2,l1,r1,1);
while(l1<q[i].x1) del(l1,l2,r2,0),++l1;
while(l1>q[i].x1) --l1,add(l1,l2,r2,0);
while(r1>q[i].x2) del(r1,l2,r2,0),--r1;
while(r1<q[i].x2) ++r1,add(r1,l2,r2,0);
最后一个参数表示的是维
如果说考试有啥收获的话,就是写不出来莫队要写前缀和暴力,而不是写啥线段树合并之类的,先拿到比较简单的部分分
联盟
这题好像 (60) 并不难做,考试的时候出现了低级错误:
没有考虑原来子树的直径……
正解推广一下就行了
如果删掉的不是直径上的边,那么答案不会变
反之需要重新求子树里面的直径
画图证明不难发现这里的新子树直径必然是原来的直径的一段再找个最长链
同时新的直径的中点必然在原来的直径上面,所以就正反处理一下即可
感觉上不是很好写,但是好像不难写
这种题目按理说也没少写了,以后记得注意一下:如果没有改直径,那么最长链就是直径
施工
考试的时候没有肝这题,下面是考后刷题
首先 (O(n^3)) dp很好写,(f_{i,j}) 表示前 (i) 个建筑中第 (i) 个是 (j) 高度的最小值
优化一下可以到 (O(n^2))
题解里面有个结论就是最优解的形态必然是若干个下陷的坑
(这里视 (a_{n+1}=a_0=inf))
那么式子推出来应该是个:
所以这个部分不难看出来是个关于 (t) 的二次函数
求出来最值,维护平方和和当前和就可以做到 (O(n^2))
考虑我们的状态定义:一定只能是从高向低的转移
那么有些状态枚举就没有意义,比如
3 2 1
(1) 直接从 (2) 那里继承来信息进行转移即可,不需要再从 (3) 那里考虑
所以我们用单调栈优化这个过程即可
这里需要注意这样两点:
(1.) 特判 (st_{top}=0,i=n+1)
(2.) 对称轴不在可行范围内的时候要弹掉
做完这题的积累:
一个比较好的结论
对于这样的式子二次函数找转移点
转移之后考虑无效转移再用单调栈优化