2018/3/12
今天全是神题啊。。。。。。。
T1 游戏
一开始一看题还以为是什么不平等博弈,但是后来下YY了一下,然后打了一波记忆化搜索,居然过了大样例,然后觉得这个搜索应该是对的,应该有60分,然后看了一眼时间,已经一个小时了,然后就决定先看看别的题,再来优化优化。
然后最后也没有时间来搞T1了
然后这个搜索也不太对,只有50分
正解其实也是可以是搜索,但是要针对于每一个点来搜索,记忆化一波应该就可以过了,但是这样弄起来细节很多,还有一种更加清真的算法,就是从已有的状态来推位置的状态,就是如果一个必败态到的所有点都是必胜态,然后如果一个必胜态指向另一个状态,就把这个状态的点度数++,如果度数满了,那么就说明自己这个点也是必败的,然后就把他也扔到队列了就好了,对于剩下没有确定状态的点就都是loop,其实也是很好证明的,如果一个点没有确定状态,那么这个点一定不能到达一个必败态,而且它没有被所有的必胜态填满,那么当前这个点的最优策略就是走环了。。
T2 树
这个题的暴搜我居然没有想到,有一种就是根据prufer序列来搜,然后判一下便就好了,还有一种就是枚举存在哪些边,然后用矩阵树来统计一下就好了,然后剩下三十分的部分分用矩阵数也是很好弄的;
正解就是考虑矩阵树乘出来的是每一种生成树边权乘积的和,那么就可以把原树中的边边权设为1,然后剩下的边设为x,那么矩阵树乘出来就是一个多项式,然后x^k项前面的系数就是表示不选k条原树中的边的方案数,然后就是跑n遍矩阵数,求出n个点值,然后插值求多项式就好了。。。。。然而我并不会多项式插值
但是这个东西其实也可以高斯消元来求解,就是类似的构造n个方程,然后解一下系数就好了。
T3 序列
这个题相当神啊。。。。。。
学了一个50分的做法就觉得神的不行。
可以考虑用KD-Tree,就是把每一个询问看作是一个点,x=l,y=r, 然后这么建出KD-Tree来,然后把所有的点从小到大排序,然后依次放到KD-Tree上跑,如果 pos < mn_l || pos>mx_r 那么就return, 如果 pos>=mx_l && pos<=mn_r ,那么就对这个节点大上标记, 剩下的情况就是继续遍历儿子就好了。
然后这个标记的话要有4个,lst,mn,mx,ans, 分别表示能放入这个点表示的询问的最大值,满足这颗子树的最小值,最大值,以及这些树能产生的最优贡献,然后就是Pushdown的时候,在更新儿子的标记的同时,要拿父亲的mn,和儿子的mx取一下答案,然后注意一下边界情况就好了(说起来很简单,码起来可真不太容易)。
正解的话 就是能与i形成点对的j,要求i<j&&a[i]<a[j],(就是正着来一遍,反着来一遍)那么当我们再一次找到一个j'的时候且j'能与i组合产生更优的贡献的话,就要求a[j']<a[j],然后再考虑,如果a[j']-a[i]>a[j]-a[j']的话,那么反着来的时候,a[j]与a[j’]产生的贡献显然更优,那么就可以再加上一条限制,就是a[j']-a[i]<a[j]-a[j']
移一下项就是a[j‘]<(a[i]+a[j])/2,那么我们就可以发现对于每一个a[i],最多有 logw 个可以产生贡献的j,然后我们把所有的询问按左端点排序,然后从右向左枚举点,在用主席树来找出 log 个能与他产生贡献的点,然后把差值放到一个树状数组里,然后最后到一个左端点的时候,到树状数组里查一下答案就好了。
总结一下,T1太相信大样例了!!!,其实可以自己手造几个小一些的样例,或者想一些极端一点的情况卡一卡自己,如果不是数据结构题的话,大样例可能会很弱。
T2的话就是想那个搜索想了太长的时间,浪费了很多的时间,还是有一些小的知识点掌握的不够好,
T3就是没有怎么想,主要是T2浪费了太多的时间,感觉莫队掌握的不太好啊。。。。。。。。。。。。
还有就是码力好弱啊。
感觉别人的代码大好清真啊,自己的好丑啊。
还是多学学别人高效的实现方法吧。