这场考得我心态爆炸。。。。。。。。。
开场T1只会$n^{2}$,然后发现bfs时每个点只需要被更新一次,其他的更新都是没用的。
也就是说,我们可以只更新还没被更新的点?
于是我先YY了一个链表,发现在链表中删除一个数之后,用它更新其他点的时候,就没有办法找到它的前趋后继了,用之前的可以被卡成$O(n^{2})$,大样例都跑了2s+,然后就死了。
然后才想到set,可以保证每个点只被更新一次,然而发现我对set一无所知,一直以为begin指向为空,而end指向最大元素,调了好久,后来发现是反的。。。。
然后处理的时候又出了问题,仍然没有保证每个点只被更新一次,此时大约过去了2h,心态还是很崩的。
然后把奇偶分开,发现还是不行,最后终于发现每个点的左右边界定的过大了。
于是,在开考2.5h后,我终于自认为A掉了T1。
赶紧去打了T2暴力,突然想到回去给T1打个对拍,发现某些数据跑的还是很慢!(虽然从赛后看此时已经A了)
优化了一下,稳定在了0.1s,此时还剩5min,去打了个T3的8pts就没了。
T1
上面说过了。
T2.
首先一个非常显然但我没有看出来的结论:顺序不影响结果(因为不管怎么排序,任意横纵两排都会有一个交点)
然后我们将所有值从大到小排序,可以发现,在比它大的数填完之后,每个值能够填的区域是一个L形(矩形也算L)
只有L中间的矩形需要保证合法,因为其他地方的合法性已经在之前保证了,当前值也无法满足那些位置。
也就是说,我们当前只需要保证矩形所在的行和列合法。
令矩形为$a*b$,上面的部分长为c,下面长为d
直接计算不容易,我们考虑容斥
将L拆成两个小矩形,那么在保证所有列合法的情况下,令$f[i]$表示至少有i列不合法的情况。
容斥系数:$ans=sumlimits_{i=0}^{a}{(-1)^{i}f_i}$
我们考虑如何计算f[i]
$f[i]=inom{a}{i}*(s^{i}*((s+1)^{a+c-i}-s^{a+c-i}))^{b}*(s^{i}*(s+1)^{a-i})^{d}$
用这个式子暴力算就行了,应该挺好理解的