第三场多校: 至今最惨的一场多校。共作出两题。
1008 http://acm.hdu.edu.cn/showproblem.php?pid=4628 状态压缩优化的搜索
(0)、比赛时候直接状态压缩dp,结果TLE了。没有算好时间复杂度,第一次交的时候没有测大数据。应该多想几种方法,做到一A才行,不然卡题会卡很久。
(1)、后来直接搜索,从最后一个状态开始搜,每次都用一个回文串,然后搜另一个的最小步数。 然后过了。
(2)、搞了第四场多校后发现是自己代码实现能力太渣太渣。。。将一个状态i分解成两个子状态,其实是可以不用搜的。直接一个for循环就行了,这样妥妥过。啊啊啊。。。
for(i=0;i<bit[Len];i++)//原状态i { for(j=i;j;j=(j-1)&i)//子状态j与i^j { if(dp[j]+dp[j^i]<dp[i]) dp[i]=dp[j]+dp[j^i]; } }
1010 http://acm.hdu.edu.cn/showproblem.php?pid=4630 猜测:需要先得到某些结论才能用区间统计问题解决
(1)、其实不需要什么结论。对于每个数ai,找出它所有的因数,然后用这个因数去更新区间。比赛的时候以为时间复杂度会超,没敢往这方面想,其实不然。调和级数(1+1/2+1/3+1/4+...1/n)收敛于ln(n)+欧拉常数。ai的每个因数x,对于r为i的时候,将会影响l在[1,pre[x](x的上一个最右边的位置)]的这段区间。所以离线处理一下就可以了。每次更新[1,pre[x]],询问对于r=i的查询,询问[1,l]之间的最大值。时间复杂度为log(n)*log(n)*n+log(n)*Q;