2018/3/15-2018/3/21
已经连着几天没有写总结了,今天就一起补一发吧
2018/3/15
T1 数数数
这个题首先需要观察到一个性质就是能构成多边形的点,凸的有1中方案,凹的有3种方案,然后我们可以考虑用C(n,4)减去3点,4点共线的情况,然后在统计一下有多少个凹四边形的四个点,三点共线各异枚举举行,然后强制选择两个端点,然后在C(cnt-2,1)*C(tot-3,1),然后我们可以发现,这样会把一个四点共线的情况减了4次,然后在加上四点共线的*3就好了。 然后考虑凹的情况,其实就是可以看作是一个三角形围住的点数,这个还可以枚举矩形,然后在枚举这个矩形框住的最大三角形,用Pick定理就可以n^4计数了,然后在考虑优化,可以发现,所有的除了对角线以外的枚举,都可以用前缀和优化成O(1)的,只有对角线是O(n)的,然后考虑gcd的话,其实也是可以优化的,就是由于矩形的对称,我们可以把连向对角线两端点的线都连向一个点,这样gcd也可以O(1)用前缀和优化了,然后面积的话要用到类欧几里德,并不太会.....不过这样卡卡常的话也可以有80分
T2 算算算
其实可以很轻松的分析出一个相邻的01够成了一个转折点(有0变为1),然后很容易就是会想到枚举这个转折点,但是在什么限制下01能成为一个转折点的是一定要考虑清楚的,我就是一只没有考虑清楚,然后无论怎么DP都不对,其实也是很简单,假设转折点是i,那么i点之前的任意后缀都要求cnt(0)>cnt(1),i点之后的任意前缀都要求cnt(1)>=cnt(0),然后我们就是可以枚举转折点,在分别向两边DP,就可以O(n^3)得到70分;
正解的话就比较的NB了,就是考虑设每一个最终的序列有x个0,y个1,那么这个序列的贡献就是(x+y)*y=x*y+y^2,然后我们考虑分别统计x*y,y*y,那么我们设f1[i][j]表示从左往右,到第i位,还要填j个1才合法的方案数,f2[i][j]表示到第i位,还要填j个1才合法的所有方案中的0的个数,然后g1,g2都是类似的从右往左的对1计数,然后额外多了一个g3,是对已有的1进行y^2的计数,然后枚举1,0,-1,进行DP就好了,不太好理解的是g3的转移,其实可以联想一下平方和道的公式(y+1)^1=y^2+2*y=1。。。。。。。。
T3 串串串
这个题的正解是后缀自动机,但是我们有zzh想到的Trie树+hash就可以轻松过掉啦。。
就是把每一个小的串造成一个Trie树然后对每一个点到根的串哈希,记录一下串的个数的前缀和,然后丢进哈希表里,最后在长串上枚举每一个位置二分就好了。。。。。。。。。。。
清真无比
这次考试比较惨的教训就是一定要想清楚了,确保了正确性在码,可以允许复杂度的不优秀,但是一定要保证正确。。。
2018/3/17
T1 toll
这个题是个网络流,就是把每一条边反向在连一个inf的边就好了,可以考虑,如果一个路径有两条边被走了,那么他们一定是分别对另外的两个路径的贡献比较优,那么连了这个inf就可以是切了两条边不优,然后dinic就好了。
T2 graph
想了半天的容斥+DP但是就是有一种方案没有办法很好的转移,然后就挂了。
正解是转化成二分图来计数,把0边看作不存在的边,然后枚举加入的最后一条边所在的联通块的大小来进行转移。。。
思路还是挺神的,就是这个转化很难想到。。。。。
然后联通块计数都可以通过枚举最后一块的大小来搞吧。。。。。。。。
T3 recompile
这个题其实分析一下就是模拟LCT的过程,然后用LCT的expose计算虚边个数也就是不同的颜色个数,然后用线段树+dfs序维护一下子树信息就好了,然后如果有换根操作的话,就是考虑,查询点与现在的根在原树中的关系找到对应的区间就好了
2018/3/20
T1 洗衣服
这个题又是一个贪心,感觉贪心起来还是好弱啊。
如果只有洗衣机的话,就是弄一个堆,然后每一次找最小的,更新一下时间,放回堆里,这样就能保证洗衣服的时间是最短的,然后烘干的话也是同理,然后把每一件衣服的最短烘干时间和最长的洗衣服时间拼在一起,取一个max就是答案了,就是保证每一个烘干机都在尽量工作
T2 编码
这个是一个2-set,就是考虑如果暴力建图的话,就是把两个串匹配一下,然后根据两者之间的逻辑关系来建图就好了,正解就是用Trie来优化建图的过程,就是把所有的串的两种情况都插入到Trie里面,然后每一个Trie中的节点新建两个节点,表示从根到这个节点有没有前缀出现在最终的答案里,然后发现如果有很多串结束在相同的节点上的话就是考虑,其实他们之间也是只能选择一个1,这个限制和Trie上的限制是完全相同的,那就把它们构成一条链然后合并到Trie上就好了。
值得注意的一点就是要保证一个点选择,那么他们的前面是不能有1的然后这个限制的边很容易被遗忘
T3 猜数列
这个题神的不行
40分做法就是DP 考虑从左向右构造最终的序列,f[s][i][j]表示已经考虑了s中的线索,然后当前考虑到了第i个线索的第j位,那么最朴素的转移就是转移到j+1,但是还有一种就是要如果从第j位开始直接考虑k这个线索,而且当完全考虑完k这个线索之后,i也是合法的,那么我们就可以直接转移到f[s|(1<<i-1)][k][0],
100分的话就是在加上两维,表示向左的,但是这个时候是到这转移,所以就是当考虑完了一个线索i的时候,他可以直接跳转到某一个线索的某一个位置。
然后转移的话比较麻烦的就是最后的时候,可能一直向左或者向右转移,这个时候就是可以造出来一个0号线索,表示之后再也不向右或者向左转移了。 然后判断数字之间的冲突的话可以直接状压来表示。
2018/3/21
T1 convex
这个题想了半天凸包怎么做,就是没有往DP上想,其实DP的话也是设计f[i][j][k]表示当前的凸包是以i为起点,然后最后一条边是k->j,然后直接转移,就好了,时间复杂度是O(n^4)但是排序之后根本跑不满,然后叉积重载了之后是非常慢的,那么我们n^3预处理一下就好了
正解是考虑如果从一个凸包的最上面的点开始构造的话,那么每一条边的极角序是递增的,那么我们就是可以将所有的边拍一遍序之后,枚举每一个最上方的点,在枚举边转移,记录mx[i]是到i位置凸包点数的最大值,然后转移就好了
T2 conquer
这个看起来很长,其实还是很简单的吧,就是在每一个节点上二分他沦丧的时间,然后用vector记录一下子树的信息,这样对每一个城市沦丧的时间取Max就是答案了,
然后把二分check的式子变一变就能得到一个只和每一个点相关的值,然后用平衡树维护一下,合并子树的时候启发式合并就好了,有一个优化就是在平衡树上直接跑,然后强制选择当前的节点,然后判断在前面的节点是否合法就好了,就可以省去一个二分的Log,其实主席树也能维护但是就是不支持直接在树上二分这个操作
T3 puzzle
这个题要求一个循环卷积,如果是循环卷积的话,就是可以看作是两个长度为n的多项式卷出了一个长度是2*n-1的多项式,然后就是把后面n-1项平移加到前n-1项,然后如果x^n==1的话,那么就是相当于加了过来,然后单位复数根正好有这样的性质,那么就可以得到p*p=A ;
然后对A求一个点值,然后在进行开根,在IDFT回去看一下得到的P是否是非负整数就好了。
由于复数开根会有两个解,我们就是需要枚举解来IDFT回去,但是这样会T,其实我们可以发现P,A,都是有类似的对称性,我们就只用枚举一半的状态就可以了。
要注意一些特判的情况以及精度问题。