T1
题意概括:
给定一些二元组(x,y),代表x必须能到达y;再给定一些二元组(x,y),代表x不能到达y。问能否构造出一张有向图符合所有条件。
- 分析:
- 首先想通一点,我们为了满足第一种条件的最简单方法、对下面条件影响最小的方法就是直接连接x,y这条边。
- 我先是想了可以传递闭包一下,然后对于第二种条件,如果a【x】【y】已经等于1了,那么就无解。但是传递闭包复杂度n^3,太高了,只有20分。
- 发现两点之间连通性对我们有用的只有t组,所以每一组条件2我们可以跑一次dfs判断x能否到y。复杂度n*t,遗憾的是仍然是20分。
- 怎样一次topsort求出所有的两点之间连通性?很简单,在x到y的时候,把能到达x的点传递给y。但是复杂度是n* n,并且空间复杂度也是n n。不过我们可以把能到达x的点这个状态用二进制数存储,所以就想到了bitset。bitset的复杂度是n n/32。好像很行,可以60,嘿嘿,手写bitset更快,用每一个unsigned long long数 存64个点的状态,这样可以压到n *n/64,不过还是60。
- 上次那个算法60的原因是什么呢?其实不是时间超时,而是空间爆掉了。我们考虑怎么优化空间。可以分块,把n个点分成若干个块,每一跑一边topsort,我们只考虑块内的点到达所有点的情况。这样的话,时间复杂度是n/s* ns/32,其实还是n n/32,但是空间则由原来的n n/32变成了n s/32。 空间ok了。直接用stl的bitset可以跑过,但我感觉算出来的还是手写稳妥吧。当然补的代码是stl的,因为好写。
这题我忘了缩点,所以60被傻逼给丢掉了。
T2
是一道虚树的题吧……不是很会虚树,先咕着。
T3
啊啊啊
又出现了,期望DP。讲真的看见期望就头疼,没有好好学过这个玩意儿,也没怎么写过题。不过这题真正难点并不在这里,反正是推式子求贡献,然后转化成卷积用NTT优化,先咕着。