社区讨论
求卡常优化
P2627[USACO11OPEN] Mowing the Lawn G参与者 4已保存回复 22
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 22 条
- 当前快照
- 1 份
- 快照标识符
- @mhjt398k
- 此快照首次捕获于
- 2025/11/04 08:03 4 个月前
- 此快照最后确认于
- 2025/11/04 10:26 4 个月前
rt,这题我用优先队列做,但是一直超时。
现在调到到差 0.01 秒,还能救吗?
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int arr[1145144];
int sum[1145144];
int dp[1145144][2];
// 不取: dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
// 取 : dp[i][1]=
struct node {
int val,ind;
bool operator < (const node &other) const {
return val<other.val;
}
};
priority_queue<node> q;
int get(int i,int j) { // i<j
return sum[j]-sum[i-1];
}
void out() {
for(int i=1;i<=n;i++) cout<<dp[i][0]<<" ";
cout<<endl;
for(int i=1;i<=n;i++) cout<<dp[i][1]<<" ";
cout<<endl;
}
signed main()
{
ios_base::sync_with_stdio(0);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>arr[i];
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+arr[i];
q.push({0,0});
for(int i=1;i<=n;i++) {
while(!q.empty()) {
if (q.top().ind<i-k) q.pop();
else break;
}
dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
for(int j=1;j<=k;j++) {
if (i-j+1<=0) break;
//int tmp=(i-j>=1)?(dp[i-j][0]):0;
//cout<<q.top().val<<endl;
dp[i][1]=max(dp[i][1],sum[i]+q.top().val);//sum[i]-sum[i-j]
}
q.push({dp[i][0]-sum[i],i});
}
//out();
cout<<max(dp[n][0],dp[n][1]);
}
回复
共 22 条回复,欢迎继续交流。
正在加载回复...