线段树解法 0pts 求调
  • 板块P1725 琪露诺
  • 楼主panrui_SCZ
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/11/25 15:51
  • 上次更新2024/11/25 19:25:32
查看原帖
线段树解法 0pts 求调
500200
panrui_SCZ楼主2024/11/25 15:51

rt hack 数据通过,原始数据全WA

#include<bits/stdc++.h>
using namespace std;
struct tree{
	int l,r,v;
}t[1145141];
void build(int l,int r,int p){
	t[p].l=l,t[p].r=r;
	if(l==r) return;
	int mid=(l+r)>>1;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
}
void update(int l,int x,int p){
	if(t[p].l==t[p].r){
		t[p].v=x;
		return;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) update(l,x,p*2);
	else update(l,x,p*2+1);
	t[p].v=t[p*2].v+t[p*2+1].v;
}
int query(int l,int r,int p){
	if(t[p].l>=l&&t[p].r<=r) return t[p].v;
	int mid=(t[p].l+t[p].r)>>1;
	int ans=-11451419;
	if(l<=mid) ans=max(ans,query(l,r,p*2));
	if(r>mid) ans=max(ans,query(l,r,p*2+1));
	return ans;
}
int a[200005],f[200005];
int main(){
	int n,l,r;
	scanf("%d%d%d",&n,&l,&r);
	build(1,n,1);
	cin>>a[0];
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	memset(f,-0x3f,sizeof(f));
	f[0]=0;
	for(int i=1;i<=r;i++){
		if(i==l)
			f[i]=a[i];
		if(i>l)
			f[i]=query(1,i-l,1)+a[i];
		if(f[i]==f[200004]+a[i]) f[i]=f[200004];
		update(i,f[i],1);
	}
	for(int i=r+1;i<=n;i++){
		f[i]=query(i-r,i-l,1)+a[i];
		if(f[i]==f[200004]+a[i]) f[i]=f[200004]; 
		update(i,f[i],1);
	}
	int ans=-11451419;
	for(int i=n-r+1;i<=n;i++)
		ans=max(ans,f[i]);
	cout<<ans<<endl;
	return 0;
}
2024/11/25 15:51
加载中...