Luogu P11230 CSP-J 2024 接龙 题解 [ 线性 dp ] [ 前缀和 ]
接龙:一个前缀和优化 dp 或者单调队列优化 dp 的题目。
怎么周围的人都秒了 T3 不会 T4 啊,只有我觉得 T4 很套路,T3 比较难写吗。
暴力 dp
为了避免多维的状态定义,我们把每个人的子序列化为长度最多为
我们定义状态
有一个显然的转移,我们遍历第
时间复杂度
第一步优化
注意到我们的限制有一个是“不能从同一个人那里转移过来”,考虑一个和前几年提高组假期计划那题很像的想法。
原题中是记录前
这个可以通过在每一轮结束之后预处理一遍得到。
时间复杂度
第二步优化
到这里我们就快做完这题了。观察到一个数的结果为
但这是普及组,不能考单调队列。于是我们换一种普及组思路。因为这题可以预处理,而查询操作是查询
时间复杂度
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int t,n,k,q,f[105][200005][2],a[200005],bl[200005],tot,can[200005];
bitset<200005>dp[105];
void init()
{
memset(f,-1,sizeof(f));
for(int r=1;r<=100;r++)
{
//count can
if(r==1)
{
for(int i=1;i<=tot;i++)can[i]=can[i-1]+(a[i]==1);
}
else
{
for(int i=1;i<=tot;i++)can[i]=can[i-1]+((f[r-1][a[i]][0]!=-1&&f[r-1][a[i]][0]!=bl[i])||(f[r-1][a[i]][1]!=-1&&f[r-1][a[i]][1]!=bl[i]));
}
//count dp
int pre=0;
for(int i=1;i<=tot;i++)
{
if(bl[i]!=bl[i-1])pre=i;
int rn=i-1;
int ln=max(pre,i-k+1);
dp[r][i]=((can[rn]-can[ln-1])>0);
}
//count f
for(int i=1;i<=tot;i++)
{
if(dp[r][i]==0)continue;
if(f[r][a[i]][0]==-1)f[r][a[i]][0]=bl[i];
else if(f[r][a[i]][1]==-1&&f[r][a[i]][0]!=bl[i])f[r][a[i]][1]=bl[i];
}
// for(int i=1;i<=tot;i++)
// {
// cout<<"can["<<r<<"]["<<i<<"]="<<can[i]<<endl;
// }
// for(int i=1;i<=tot;i++)
// {
// cout<<"f["<<r<<"]["<<i<<"][0]="<<f[r][i][0]<<endl;
// cout<<"f["<<r<<"]["<<i<<"][0]="<<f[r][i][1]<<endl;
// }
}
}
void solve()
{
scanf("%d%d%d",&n,&k,&q);
tot=0;
for(int i=1;i<=n;i++)
{
int l;
scanf("%d",&l);
for(int j=1;j<=l;j++)
{
tot++;
scanf("%d",&a[tot]);
bl[tot]=i;
}
}
init();
while(q--)
{
int r,c;
scanf("%d%d",&r,&c);
printf("%d\n",(f[r][c][0]!=-1||f[r][c][1]!=-1));
}
}
int main()
{
freopen("chain.in","r",stdin);
freopen("chain.out","w",stdout);
scanf("%d",&t);
while(t--)solve();
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战