根本不知道有ARC。然后unrated register。然后一直在聊天,只写了A。难蚌。
按照pog的说法,这场应该不看题直接写代码!!1这样才能写的飞快。
摆了一上午。我好像一直在贺题,所以还是记录一下。
A - Seat Occupation
你发现就 \(L\) 个人,单独来的他肯定能找到自己的座位,所以只有加入俩人的时候才有可能无解。那么我们考虑最坏情况,间隔一个位置就坐,直到两人组没地方坐为止。
\(O(n)\)
另:Echo问我为什么不可能是放中间最劣,我说不清楚。。
B - Pass on Path
我不会小学追及问题。。直觉pass次数越少越好。一般会pass两次,但如果从某个起点i开始背向出发只会pass一次。在时间 \(2l\) 的基础上加上这俩人等来等去的时间。
假设在j的地方pass。
\(ans = 2l+2|2L-2a[i]-2a[j]|\) 固定i,那么显然在a[j]最接近 \(L-a[i]\) 的时候最优。考虑<= 和 >= 的最近的情况即可 \(O(n)\)
C - Pivot
一次操作实际上相当于在数轴上把一条线段关于 \(s\) 对称。
那么实际上两数之间的相对位置是不改变的,最大值最小且所有数大于0,就是让最小值最小且大于0。
设开始的最小值和最大值分别是mn,mx
如果s=mn/mx,设d=mx-mn,d始终不变,那么最小值会+d或-d,次数任意。(看成线段在数轴上翻转)
那么最小值可以最终变成 \(mn%d\) 或 \(mx%d\)。那么此时我们思考怎么再减小最小值。
如果选中的数是s,开始的最小值是 \(r\),操作一次后 \(r\) 变为 \(2*s-r\),也就是 \(+2(s-r)\)。再重复操作是会 \(-2(s-r)\),因为此时的s已经改变。可以操作一次最大值,之后再操作,就会是 \(+2(s-r)\) 了。那么也就是说我们也可以+-任意次 \(2(s-r)\)
我们发现s=mn/mx的可以归到一般情况里。
令\(g=gcd(2*(a[i+1]-a[i]))\)。答案就是 \(min(a[1]\%g,a[n]\%g)+a[n]-a[1]\)
D - Halftree
https://www.cnblogs.com/closureshop/p/16910404.html
构造题。。这位神仙写的够清楚了。。