求解答,两种初始化为啥不一样
查看原帖
求解答,两种初始化为啥不一样
525375
Richard_Whr楼主2024/4/6 21:15

初始化 f[0][i]f[0][i] 时。 为啥只有全设为 inf 是对的。

按照道理来说应该是谁都没有被覆盖,都应该求和费用啊。

求解答

#include<bits/stdc++.h>
#define int long long
#define ls u*2
#define rs u*2+1 
using namespace std;
const int N=2e4+10,M=110,inf=1e18;
typedef pair<int,int> PII;
struct Tree
{
	int l,r;
	int minv;
	int add;
}tr[N*4];
int f[N];
int d[N],c[N],s[N],w[N];
vector<PII> q[N];
int n,m;
int res;

void pushup(int u)
{
	tr[u].minv=min(tr[ls].minv,tr[rs].minv);
}

void trans(int u,int c)
{
	tr[u].minv+=c,tr[u].add+=c;
} 

void pushdown(int u)
{
	if(tr[u].add) trans(ls,tr[u].add),trans(rs,tr[u].add),tr[u].add=0;
}

void build(int u,int l,int r)
{
	tr[u]={l,r,f[l],0};
	if(l==r) return;
	int mid=l+r>>1;
	build(ls,l,mid),build(rs,mid+1,r);
	pushup(u); 
}

void modify(int u,int l,int r,int c)
{
	if(l>r) return;
	if(tr[u].l>=l&&tr[u].r<=r) trans(u,c);
	else
	{
		pushdown(u);
		int mid=tr[u].l+tr[u].r>>1;
		if(l<=mid) modify(ls,l,r,c);
		if(r>mid) modify(rs,l,r,c);
		pushup(u);
	}
}

int query(int u,int l,int r)
{
	if(tr[u].l>=l&&tr[u].r<=r) return tr[u].minv;
	pushdown(u);
	int mid=tr[u].l+tr[u].r>>1,res=inf;
	if(l<=mid) res=min(res,query(ls,l,r));
	if(r>mid) res=min(res,query(rs,l,r));
	return res; 
}

signed main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=2;i<=n;i++) cin>>d[i];
	for(int i=1;i<=n;i++) cin>>c[i];
	for(int i=1;i<=n;i++) cin>>s[i];
	for(int i=1;i<=n;i++) cin>>w[i];
	n++;
	d[n]=inf,c[n]=0,s[n]=0,w[n]=inf;
	
	for(int i=1;i<=n;i++)
	{
		int l=lower_bound(d+1,d+1+n,d[i]-s[i])-d;
		int r=upper_bound(d+1,d+1+n,d[i]+s[i])-d-1;
		q[r].push_back({l,i});
	}
	
	res=inf;
	for(int i=1;i<=n;i++) f[i]=f[i-1]+w[i];
	f[0]=0;
	m++;
	
	for(int k=1;k<=m;k++)
	{
		build(1,0,n);
		for(int i=1;i<=n;i++)
		{
			f[i]=query(1,0,i-1)+c[i];
			for(auto Q:q[i])
			{
				int l=Q.first,id=Q.second;
				modify(1,0,l-1,w[id]);
			}
		}
		res=min(res,f[n]);
	}
	
	cout<<res<<"\n";
	
	return 0;
}
2024/4/6 21:15
加载中...