RE 玄关求条
查看原帖
RE 玄关求条
1419569
Z_kazuha楼主2024/11/24 10:19
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e4+6;
const int inf=1e18;
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
int n,k,d[N],c[N],s[N],w[N],st[N],ed[N],f[N],tree[N<<2],tag[N<<2];
struct node{int to,nxt;}e[N];
int head[N],cnt;
void add(int u,int v){
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
void pushup(int p){tree[p]=min(tree[ls(p)],tree[rs(p)]);}
void build(int p,int pl,int pr){
	tree[p]=0,tag[p]=0;				
	if(pl==pr){
		tree[p]=f[pl];
		return;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	pushup(p);
	cout<<tree[p]<<" ";
}
void addtag(int p,int d){
	tree[p]+=d;
	tag[p]+=d;
}
void pushdown(int p){
	if(tag[p]){
		addtag(ls(p),tag[p]);
		addtag(rs(p),tag[p]);
		tag[p]=0;
	}
}
void update(int p,int pl,int pr,int L,int R,int d){
	if(pl>=L&&pr<=R){
		addtag(p,d);
		return;
	}
	pushdown(p);
	int mid=(pl+pr)>>1;
	cout<<mid<<" ";
	if(L<=mid)update(ls(p),pl,mid,L,R,d);
	if(R>mid)update(rs(p),mid+1,pr,L,R,d);
	pushup(p);
}
int query(int p,int pl,int pr,int L,int R){
	if(pl>=L&&pr<=R){
		return tree[p];
	}
	pushdown(p);
	int mid=(pl+pr)>>1,res=inf;
	if(L<=mid)res=min(res,query(ls(p),pl,mid,L,R));
	if(R>mid)res=min(res,query(rs(p),mid+1,pr,L,R));
	return res;
}
signed main(){
	cin>>n>>k;
	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++,k++;
	d[n]=inf,w[n]=inf;
	for(int i=1;i<=n;i++){
		st[i]=lower_bound(d+1,d+1+n,d[i]-s[i])-d;
		ed[i]=upper_bound(d+1,d+1+n,d[i]+s[i])-d-1;
		add(ed[i],i);
		//cout<<st[i]<<" "<<ed[i]<<endl;
	}
	int now=0;
	for(int i=1;i<=n;i++){
		f[i]=now+c[i];
		for(int j=head[i];j;j=e[j].nxt){
			int v=e[j].to;
			now+=w[v];
		}
		//cout<<"*"<<f[i]<<endl;
	}
	int ans=inf;
	for(int j=2;j<=k;j++){
		build(1,1,n);
		cout<<endl<<j<<endl;
		for(int i=1;i<=n;i++){
			f[i]=query(1,1,n,1,i-1)+c[i];
			for(int k=head[i];k;k=e[k].nxt){
				int v=e[k].to;	
				update(1,1,n,1,st[v]-1,w[v]);
			}
			//cout<<f[i]<<" ";
		}
		ans=min(f[n],ans);
	}
	cout<<ans;
	return 0;
}
2024/11/24 10:19
加载中...