来来来,补一发昨天的题解
T1 考考试
这个题看起来应该是一个打表找规律的题,然后我就先想弄一个暴力,打一个表,然后我就是开始考虑,是枚举二进制验十进制还是用十进制验二进制,后来觉得如果枚举二进制的话,转化出来的十进制都不一定只有1或0,然后就果断枚举十进制打了一个表,dfs跑得还挺快,能拿40分,然后就开始找规律,看着看着惊喜的发现10的整数次幂都是合法的,然后我就按每一个数的十进制的位数分了一下类,然后发现每一个数的后缀,都在之前的合法数字中出现过,但是不是之前的所有合法数字都能和某一个10^k的数整在一起形成一个新的数,然后看了一会,觉的不太会弄,就去看后面的题了,然后最后半个小时左右的时候,我又来看这个题,突然发现了一个很好的性质,设一个二进制数的十进制后缀的最高为是i,然后一个大于这个数的10的整数次幂的数最低有1的位是j,只要保证小的那个二进制数从i到j都没有1就行了,然后我就直接开了一个vector的f[i],然后暴力填表转移就行了。
PS:其实10的整数次幂都是合法的也很好解释,就是 x*10 = x<<3 + x<<1,可以发现最少都左移了一位,那么就可以保证他是的合法的
T2 开开车
这个题并不太会做,然后就无脑弄了一个spfa上去,只有25分,然后bfs可以有35分
正解就是两个不相邻的点,他们之间的最短距离一定是穿过某一条对角线的,然后我们就是可以直接对这个图进行分治,多画几个图就可以发现,如果尽量让一条分割线的两边的点尽量一样多,那么一边的点最少不超过n/3,那么有了这个性质,就可以来分治了,我们只要处理出一个分支块里的点,到当前分割线两端点的距离就好,查询的时候就是如果两个点不属于一个块,就可以直接用处理出来的距离简单计算,然后类似于线段树分治+凸包那样,可以直接开一个 n*log 的 vector ,然后每一层暴力找到一个分割线,然后最后将所有的询问直接离线下来,类似于CDQ分治,将询问放在对应的块中,当不能递归的时候,就计算答案就好了。
T3 画画图
n^2暴力,貌似有几个点挂了????
这个题有一个良好的性质,就是树是随机的,树深只有log。
然后我们可以把所有的边排序,然后从小到大网里面插入边,记已插入的边的边权是1,未插入的是-1,然后对于每一次插入边只要统计路径权值和是1的路径数就好了,那么就可以记录一个数组f[i][j]表示i这可子树中的点到i权值和是j的点数,然后每次新插入边后,可以直接跳父亲,更新一波f数组,统计一波答案就好了
。。。。。 在一部在原来的代码上改改就交了, 新改的总是会和之前的产生莫名其妙的错误,然后我还坚信他是正确的,然后T3就搞了一下午
总结一下就是,暴力也是要动脑卡常的,像这种逐级递增,而且是增长幅度差不多的时候,暴力稍微漂亮一点就可以多拿一点分
然后就是如果一道题想不出来,并且觉得自己目前想的已经有一定深度了,但就是差一点,那么就是可以弄一弄别的题,然后在回来看着到题