T1
考虑每个值对逆序对数的贡献
从大往小了走,每次剪掉贡献即可
写完拍完大概是 (7:50) 其实不是很快
T2
比较神奇的题目
考试的时候写了纯暴力和不相交还有在一行的情况
考后补上正解
这题目其实考完听 (lin4xu) 说就发现自己确实有点差距了
根本没有往建图那方面想,外加上前天晚上的 (T2),直接拓扑就能 (40)
不过自己冲那题单调性的性质了
考虑对冲突进行建图,因为冲突是必须要考虑的
其实这个 (T) 形板的本质就是选择四向其中一个删掉
如果有一个点被三个十字架覆盖了,那么肯定没有解
那么一共只有两种情况,其一是所有的冲突可以连成一个树,其二是可以整成一个基环树
是树的时候选择一个最小的值剪掉就行了
把图上所有的特殊点和特殊点周围的几个点连上边,会形成一些联通块
这些联通块里面如果特殊点的个数(也就是板的个数)不足于板之间边的个数,那么无解
如果相同的话就是个基环树,反之就是树
树的话找整个块里面最小的 (val) 剪掉就行了
想明白之后,代码并不难写
思路积累:建图
如果产生在矩阵上面产生冲突关系这种可以试试建图再找结论
T3
考试的时候过不了样例的复杂度正确的做法就过了,我只冲了暴力(不过好像过不过并不重要)
最妙的一步转化是二分 (check) 的时候逆向维护
即先把竹子拎上去然后往下掉,满足最后所有的 (H_ile h_i) ,同时过程中不能出负数
直接贪心维护下次的时间即可
这样做是 (O((n+mk)log n log Maxx)) 的,并不能过掉所有数据
考虑如何提升效率,按照多次见过的,比如 贪吃蛇 和 蚯蚓
设 (c_{i,j}) 为竹子 (i) 在第 (j) 天被砍的次数,所以一个竹子的最后的高度值是
维护每天的看树情况,用 (m) 个队列维护即可
相当妙的做法
T4
好像大家都用的高斯消元或者手动解方程?
不过还可以有这样一种做法:
观察到这个每个数是多少没有什么用,我们只需要差值
设当前的量是 (a>b>c,m=frac{a+b+c} 3)
那么先让 (a) 拿出来 (a-m) 个,这样做是有 (2^{a-m}) 中情况,记得乘上逆元,也就是说
这里的 (k) 显然可以枚举,然后根据线性性来推一下概率
这东西是可以发现是可以归纳成 (f_{0,x,2x})
具体就是说这个每次有多少步就给另外一个人
发现这个 (n^2) 求有点费劲,那么打表发现这个是 (f(0,x,2x)=2x)
所以每次求一下就行了
确实是道非常好的计数题