
日记
昨天祝老问我 dp 要不要加难度,我说加。
Modular SequenceLink to
我们看到 可以是 也可以是 。那么肯定有 ,于是我们判断无解首先就判断 。然后我们设 。那么 数组肯定形如 。且 。
然后我尝试贪心构造 ,成功的 wrong answer Solution exists, but participant said No (test case 3970)
。这个 3970
就很绝望。
正解是 dp,设 表示使得 的最小 。我们可以通过枚举最后一段的长度来转移。枚举状态 ,转移 。合起来 。然后根据它来判断是否可行。构造合法序列就看它从哪里转移的就行了。
Distance to DifferentLink to
诶您猜怎么着?赛时我都想到 了,然后放弃去看上面的那道了。
我们发现 数组一定可以分成几段,最左边的一段单调递减,最右边的一段单调递增。中间的先递增再递减。于是我们设 表示分 段,最后一段结尾为 的方案数。我们发现,如果一段长度为 的区间其实和两段长度为 的区间形态一样,于是我们规定中间的段长度不能为 。于是我们有转移:,注意特判第一段和最后一段不需要减 。
GCD on a gridLink to
hrl:祝老特有的不识数,1600 ~ 2000 的题里面放 2100,2100 ~ 2400 的题里面放 1900。
我:你就偷着乐吧!
我们发现路径一定经过 。于是我们考虑循环 的每一个因数 。看看是否有一条路径只经过模 为 的数。时间复杂度 。带一个 左右的常数。因为 的数量级因数最多就 多个。
Learning to PaintLink to
其实老早以前就看过这道题。但是没做。
我们发现,一个位置 如果要转移 ,那么贡献一定是 ,这是不变的。我们就可以设 为将前 个数分段的最大的 个数。转移就是这样:先从 里取出最大的放进备选里,然后执行 次,每次从备选里去最大的一个,并把它接着的下一个放进备选。
还是放一下代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
#include<bits/extc++.h>
#define int long long
using 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。究其原因是没传引用。
这个喷不了这个是纯糖。
后日谈 Link to 后日谈
yzp 在做图论简单题。然而这些题我老早就做过了。
但是黄色的题啊,我一眼就看出来了,而且 都能过的题,他看不出来???
然后尝试理解线性基,只能感叹数学的神奇。
日记
© 伊埃斯 | CC BY-NC-SA 4.0