专栏文章
T551863 拒绝高低房
题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqr5tkm
- 此快照首次捕获于
- 2025/12/04 09:23 3 个月前
- 此快照最后确认于
- 2025/12/04 09:23 3 个月前
注意到,如果第 间房子可以与第 间房子在同一分组中(),那么一定要满足一个条件:设 表示第 间房左边第一个和它差大于 的房子,则 。那么状态转移方程就出来了:。
提交后可以得到0分的好成绩。
为什么呢?
考虑 这个序列:,但 显然不能放在同一组,因为 不满足要求,因此可以发现,如果前一个数的 小于当前数,那么当前数也不能到达 左边。故应加上预处理 。
然后写出代码:
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int a[200001];
int dp[200010];
int lmao[200001];
const int mod=1000000007;
int aaabs(int x,int y)
{
return max(x,y)-min(x,y);
}
main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// ifstream cin("8.in",ios::in);
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
for(int j=i-1;j;j--)
if(aaabs(a[j],a[i])>k)
{
lmao[i]=j;
break;
}
lmao[i]=max(lmao[i],lmao[i-1]);
// cout<<lmao[i]<<" ";
}
// cout<<endl;
dp[1]=dp[2]=1;
for(int i=2;i<=n;i++)
{
// dp[i+1]=dp[i]-dp[lmao[i]];
// dp[i+1]=(dp[i]+dp[i+1])%mod;
int sum=0;
for(int j=lmao[i]+1;j<=i;j++)
sum+=dp[j];
dp[i+1]=sum,dp[i+1]=(dp[i+1]+mod)%mod;
}
cout<<dp[n+1]%mod;
}
注意到中间dp可以用前缀和优化,因此,边dp边将现在的dp值加上之前的形成前缀和,前面的 预处理可以用单调栈优化,时间复杂度 。
代码还没写。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...