昨天祝老问我 dp 要不要加难度,我说加。
Modular Sequence↗
我们看到 可以是 也可以是 。那么肯定有 ,于是我们判断无解首先就判断 。然后我们设 。那么 数组肯定形如 。且 。
然后我尝试贪心构造 ,成功的 wrong answer Solution exists, but participant said No (test case 3970)。这个 3970 就很绝望。
正解是 dp,设 表示使得 的最小 。我们可以通过枚举最后一段的长度来转移。枚举状态 ,转移 。合起来 。然后根据它来判断是否可行。构造合法序列就看它从哪里转移的就行了。
Distance to Different↗
诶您猜怎么着?赛时我都想到 了,然后放弃去看上面的那道了。
我们发现 数组一定可以分成几段,最左边的一段单调递减,最右边的一段单调递增。中间的先递增再递减。于是我们设 表示分 段,最后一段结尾为 的方案数。我们发现,如果一段长度为 的区间其实和两段长度为 的区间形态一样,于是我们规定中间的段长度不能为 。于是我们有转移:,注意特判第一段和最后一段不需要减 。
GCD on a grid↗
hrl:祝老特有的不识数,1600 ~ 2000 的题里面放 2100,2100 ~ 2400 的题里面放 1900。
我:你就偷着乐吧!
我们发现路径一定经过 。于是我们考虑循环 的每一个因数 。看看是否有一条路径只经过模 为 的数。时间复杂度 。带一个 左右的常数。因为 的数量级因数最多就 多个。
Learning to Paint↗
其实老早以前就看过这道题。但是没做。
我们发现,一个位置 如果要转移 ,那么贡献一定是 ,这是不变的。我们就可以设 为将前 个数分段的最大的 个数。转移就是这样:先从 里取出最大的放进备选里,然后执行 次,每次从备选里去最大的一个,并把它接着的下一个放进备选。
还是放一下代码:
#include<bits/extc++.h>#define int long longusing namespace std;typedef pair<int,int> pii;int n,m;int a[1005][1005];queue<int> tmp[1005];priority_queue<pii> pend;priority_queue<int> dp[1005];template<typename typ>void clear(priority_queue<typ> &q){while (!q.empty())q.pop();}int get(int x){int res = dp[x].top();dp[x].pop();tmp[x].push(res);return res;}void solve(){ scanf("%lld%lld",&n,&m); for (int i = 0; i <= n; i++) clear(dp[i]); for (int i = 1; i <= n; i++) for (int j = i; j <= n; j++) scanf("%lld",a[i] + j); dp[0].push(0); for (int i = 1; i <= n; i++) { clear(pend); pend.push({a[1][i],-1});// 放进备选 for (int j = 0; j < i; j++) pend.push({get(j) + a[j + 2][i],j});// 放进备选 for (int j = 1; j <= m && !pend.empty(); j++) { auto [val,id] = pend.top();// 取出最大值 pend.pop(); dp[i].push(val);// 转移 if (~id && !dp[id].empty()) pend.push({get(id) + a[id + 2][i],id});// 将它的下一个放进备选 } for (int j = 0; j < i; j++) { while (!tmp[j].empty()) { dp[j].push(tmp[j].front()); tmp[j].pop(); // 别忘了还原 } } } while (m--) { printf("%lld%c",dp[n].top(),m ? ' ' : '\n'); dp[n].pop(); }}signed main(){ int t; scanf("%lld",&t); while (t--) solve(); return 0;}这玩意的 clear 调了我 min。究其原因是没传引用。
这个喷不了这个是纯糖。
后日谈
yzp 在做图论简单题。然而这些题我老早就做过了。
但是黄色的题啊,我一眼就看出来了,而且 都能过的题,他看不出来???
然后尝试理解线性基,只能感叹数学的神奇。
