HDU - tag :: Multi-University 大合集
Posted caturra
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - tag :: Multi-University 大合集相关的知识,希望对你有一定的参考价值。
说明:按无序更新,只更(会)水题
4632
题意:求字符串的回文子[序列]个数
区间DP,设(dp[i][j])为([i,j])范围内的回文子序列个数,
由容斥定理可得(dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1])
如果(i)和(j)本身就可以构成回文,那就多增加(dp[i+1][j-1]+1)个回文子序列(1代表只含(i,j)的子序列)
https://paste.ubuntu.com/p/Sjh9c9K9H7/
6315
题意:给出a,b数组,区间上两种操作,给(a[L,R])+1s,或者求(sum_{i=l}^{r}a_i/b_i)
一看就知道是吉司机乱搞型线段树(低配版),暴力剪枝就好
维护区间a的最大值和b的最小值,如果存在相交的部分则证明可能产生新的贡献,
此时暴搜到叶子把可能的a置回0并加上贡献就好
然后疯狂TTTT
网上搜了一波题解好像说是会改变lazy的判断?(虽然觉得没有道理但是我认(怂)了
于是换一种策略,既然lazy依赖与a的最值,那我们尽量不碰它,改为b的值翻倍
然后过了(???)
https://paste.ubuntu.com/p/3YnKKvQf68/
4630
题意:给定(a[1...n]),多次询问([L,R])中的任意一对数使得(gcd(a_i,a_j))最大
对于gcd,区间内至少存在两个相同的因子才能作为合法的解,存在两个相同因子且最大就是最优的解
对区间右端点进行离线排序,用线段树维护([L,R])内最大的gcd(存在两次以上的因子)
具体的更新策略:记录因子(j)的上一次出现的地方(last_j),当(last_j)已存在时再插入(last_j)就能维护两次以上的信息,离线处理保证了后面的因子不会插入到当前查询范围的某个(last_j)中,具体看代码
https://paste.ubuntu.com/p/SzGh3DCpt3/
6133
题意:给出一棵树共(n)个顶点,每个顶点有一个权值(val_i),你需要对每个节点统计一个最优解
每个节点的解按照一定规则产生:取出该节点的子树下所有的顶点,把顶点任意排序成一个序列,设为(v_1,v_2...,v_k)
此时解为(sum_{i=1}^{k}sum_{j=1}^{i}val_{v_j}),最小的解为最优解
对于每个解的处理来说,子树下值小的顶点肯定放前面,按这样来贪心无疑是正确的(前缀贡献尽量小)
那么对于无序的插入过程,当前节点(u)的贡献为(val_u+cnt+num*val_u)
其中(cnt)为当前小于(val_u)的数字和,(num)为当前大于等于(val_u)的个数和
因为是子树问题,用树状数组暴力合并答案,复杂度(O(nlog^2n))
https://paste.ubuntu.com/p/YCYKwxjMjS/
6096
题意:给定n个字符串,m次询问,每次询问多少个字符串前缀是pre且后缀是suf,前后缀不可相交
字典树同时存储前后缀,假设字符串长为len则更新2*len个节点,依次按s[0],s[len-1],s[1],s[len-2],s[2]...更新
对于询问,按pre[0],suf[len2-1],pre[1],suf[len2-2],...pre[len1-1],suf[0]查询
如果前后缀不等长则用特殊字符填充,询问若碰到特殊字符就当前层暴搜(由于后一层前后缀肯定存在确定字符,所以不会被卡)
必须要确保的是询问时字典树中任一字符串必须长度大于等于当前查询的前后缀长度和(xxx xx xx非法)
因此需要离线处理
时间复杂度(O(能过))
https://paste.ubuntu.com/p/rWTpqp2tyT/
以上是关于HDU - tag :: Multi-University 大合集的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1171 Big Event in HDU(01背包)
BestCoder Round #77 (div.2)(hdu5650,hdu5651(逆元),hdu5652(二分),hdu5653(dp))