联赛模拟测试33

合并集合

裸的石子合并,双指针扫一遍记录一下每个区间内不同数字的个数,然后区间dp就可以了

ZYB建围墙

六边形可以围出的面积最大,然后考虑大于当前房子数的最小六边形(可以直接算,也可以二分),然后考虑将某几面的强向里面移动就可了

ZYB和售货机

将当前节点的最优和次优方案记录下来,然后按最优的建图,如果图中没有环,那么,我们可以直接把这些位置的收益计算出来,否则,对于环上的所有点,其中有一个必须以次低价买入。统计一下这样的亏损,取最小即可。

ZYB玩字符串

神奇的DP;
dp[i][j]表示前从i到j有(j-i)%len位和p串的前(j-i)%len位匹配,剩下的位数可以消去,是否可行
首先,考虑一个合法的解长什么样子,肯定有

1. s[l] == s[0] && s[n-1] == s[r]
2. cnt[ch-'a'] && cnt[ch-'a'] % num[ch-'a'] == 0
3. cnt[ch-'a'] && cnt[ch-'a'] / num[ch-'a'] == n / len

(cnt表示某一个字母在原串中出现的次数,num表示某一个字母在p串中出现的次数)
考虑加入一位,有两种方法

  1. 作为前缀和后面的匹配
f[i][j]|=f[i][j-1]&(s[j]==now[(j-i)%len]);
  1. 和前面的一段组合成一个完整段
f[i][j]|=f[i][j-k*len]&f[j-k*len+1][j];

题目要求求字典序最小,建议用string

posted @ 2020-11-19 17:59  sodak  阅读(76)  评论(0编辑  收藏  举报