社区讨论
求调,玄关
学术版参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mlkcqg1h
- 此快照首次捕获于
- 2026/02/13 11:52 6 天前
- 此快照最后确认于
- 2026/02/13 11:59 6 天前
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int tree[maxn*4];
int dp[maxn];
int n,a[maxn],l,r;
int read(){
int su=0,pp=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')pp=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){su=su*10+ch-'0';ch=getchar();}
return su*pp;
}
int left_son(int k){
return k*2;
}
int right_son(int k){
return k*2+1;
}
void push_up(int k){
tree[k]=max(tree[left_son(k)],tree[right_son(k)]);
return ;
}
void build_tree(int k,int l,int r){
if(l==r){
tree[k]=dp[l];
return ;
}
int mid=(l+r)>>1;
build_tree(left_son(k),l,mid);
build_tree(right_son(k),mid+1,r);
push_up(k);
return ;
}
void modify(int k,int l,int r,int X,int V){
if(l==X&&r==X){
tree[k]=V;
return ;
}
int mid=(l+r)>>1;
if(X<=mid){
modify(left_son(k),l,mid,X,V);
}
if(X>mid){
modify(right_son(k),mid+1,r,X,V);
}
push_up(k);
return ;
}
int query_max(int k,int l,int r,int L,int R){
if(L<=l&&R>=r){
return tree[k];
}
int mid=(l+r)>>1;
int ans=INT_MIN;
if(L<=mid){
ans=max(ans,query_max(left_son(k),l,mid,L,R));
}
if(R>mid){
ans=max(ans,query_max(right_son(k),mid+1,r,L,R));
}
return ans;
}
int main(){
n=read();
l=read();
r=read();
for(int i=0;i<=2*n;i++) dp[i]=INT_MIN;
for(int i=1;i<=n;i++) a[i]=read();
dp[0]=a[0];
build_tree(1,0,n);
for(int i=l;i<=n;i++){
int left=i-r,right=i-l;
if(left<0) left=0;
int max_ans=query_max(1,0,n,left,right);
//cout<<i<<" "<<left<<" "<<right<<" "<<" "<<query_max(1,0,n,left,right)<<" "<<max_ans<<endl;
//cout<<max_ans<<endl;
dp[i]=max(dp[i],max_ans+a[i]);
//cout<<dp[i]<<" "<<max_ans<<" "<<a[i]<<endl;
modify(1,0,n,i,dp[i]);
}
//cout<<dp[1]<<" "<<query_max(1,0,n,0,1)<<endl;
//cout<<dp[1]<<endl;
int ans=0;
for(int i=0;i<=n;i++){
if(i+r>n){
//cout<<a[i]<<" "<<dp[i]<<endl;
ans=max(ans,dp[i]);
}
}
cout<<ans;
return 0;
}
样例不过,但是90分。hack全WA。样例莫名奇妙的跑出来个23。
回复
共 1 条回复,欢迎继续交流。
正在加载回复...