线段树dp求调,只AC了几个,其它全WA
查看原帖
线段树dp求调,只AC了几个,其它全WA
1112954
lsc72楼主2024/5/19 19:18
#include<bits/stdc++.h>
using namespace std;
struct node{long long l,r,n,add=-1;
};
node tree[10000010];
long long a[100010],b[100010],T;
long long build(int p,int l,int r){
	node temp;temp.l=l;temp.r=r;
	if (l==r)
	{
		if (l==1){temp.n=0;tree[p]=temp;return tree[p].n;}
		else{temp.n=1e10;tree[p]=temp;return tree[p].n;}
	}
	int mid=(l+r)/2;
	temp.n=max(build(p*2,l,mid),build(p*2+1,mid+1,r));
	tree[p]=temp;
	return tree[p].n;
}
long long update(int s,int p){
	if (s==p) return tree[s].n;
	int mid=(tree[s].l+tree[s].r)/2;
	if (tree[p].l<=mid) update(s*2,p);
	if (tree[p].l>mid) update(s*2+1,p);
	return tree[s].n=max(tree[s*2].n,tree[s*2+1].n);
}
void change(int s){
	if (tree[s].add==-1) return;
	if (tree[s*2].l!=0&&tree[s].add<tree[s*2].n){
		tree[s*2].n=tree[s].add;
		tree[s*2].add=tree[s].add;
	}
	if (tree[s*2+1].l!=0&&tree[s].add<tree[s*2+1].n){
		tree[s*2+1].n=tree[s].add;
		tree[s*2+1].add=tree[s].add;
	}
	tree[s].add=-1;return;
}
long long find(long long p,int s)
{
	if (tree[s].l==p&&p==tree[s].r) return tree[s].n;
	change(s);
	int mid=(tree[s].l+tree[s].r)/2;
	if (p<=mid) return find(p,s*2);
	if (p>mid) return find(p,s*2+1);
}

void search(int m,int l,int r,int s){
	if (tree[s].l==l&&r==tree[s].r){
		if(m<tree[s].n){
			tree[s].n=m;
			if (tree[s].l!=tree[s].r) tree[s].add=m;
			update(1,s);
		} 
		return;
	}
	change(s);
	int mid=(tree[s].l+tree[s].r)/2;
	if (l<=mid&&m<tree[2*s].n) search(m,l,min(mid,r),2*s);
	if (r>mid&&m<tree[2*s+1].n) search(m,max(mid+1,l),r,2*s+1);
	return;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); 
	cout.tie(NULL);
	cin>>T;
	while (T--)
	{
		int n;
		long long answer=0;
		cin>>n;
		for (int i=1;i<=n;i++) {cin>>a[i];b[i]=b[i-1]+a[i];}
		build(1,1,n);
		for (int i=1;i<=n-1;i++) 
		{
			if (a[i]>=1) search(find(i,1)+a[i],i+1,i+a[i],1);
		}
			
		for (int i=1;i<=n;i++) 
		{
			answer=max(answer,b[i]-find(i,1));
		}
		cout<<answer<<'\n';
	}
	return 0; 
}

求助,卡了好久了

2024/5/19 19:18
加载中...