10pts WA on#1#3#4#5#6#7#8#9#10求调【玄关】
查看原帖
10pts WA on#1#3#4#5#6#7#8#9#10求调【玄关】
1414117
xxxasybt2024楼主2025/2/6 11:32
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10,INF=1e9+10;
int n,d[N],c[N],s[N],w[N];
int tr[N],lazy[N],cnt;
int h[N],e[N],ne[N],idx;
int ed[N],st[N],f[N];
int p,k;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
	return x*f;
}
void build(int u,int l,int r){
	lazy[u]=0;
	if(l==r){
		tr[u]=f[l];
		return ;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	tr[u]=min(tr[u<<1|1],tr[u<<1]);
}
void pushdown(int p){
	if(lazy[p]!=0){
		tr[p<<1]+=lazy[p];
		tr[p<<1|1]+=lazy[p];
		lazy[p<<1]+=lazy[p];
		lazy[p<<1|1]+=lazy[p];
		lazy[p]=0;
	}
}
void update(int p,int l,int r,int L,int R,int v){
	//if(l>r) return;
	if(l<=L&&R<=r){
		tr[p]+=v;
		lazy[p]=v;
		return;
	}
	pushdown(p);
	int mid=L+R>>1;
	if(l<=mid) update(p<<1,l,r,L,mid,v);
	if(r>mid) update(p<<1|1,l,r,mid+1,R,v);
	tr[p]=min(tr[p<<1|1],tr[p<<1]);
}
int query(int p,int l,int r,int L,int R){//cout<<"l:"<<l<<" r:"<<r<<" L:"<<L<<" R:"<<R<<endl;
	//if(l>r) return INF;
	if(l<=L&&R<=r) return tr[p];
	int mid=L+R>>1,sum=INF;
	pushdown(p);
	if(l<=mid) sum=min(sum,query(p<<1,l,r,L,mid));
	if(r>mid) sum=min(sum,query(p<<1|1,l,r,mid+1,R));
	return sum;
}
void add(int a,int b){
	++idx;
	e[idx]=b,ne[idx]=h[a],h[a]=idx;
}
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);
	}
	int sum=0;
	for(int i=1;i<=n;i++){
		f[i]=sum+c[i];
		for(int j=h[i];j;j=ne[j]){
			int v=e[j];
			sum+=w[v];
		}
	}
	int ans=f[n];
	for(int i=2;i<=k;i++){
		build(1,1,n);
//		for(int j=1;j<=n;j++)cout<<f[j]<<' ';
//		cout<<endl;
		for(int j=1;j<=n;j++){
			if(i>j) f[j]=c[j];
			else f[j]=c[j]+query(1,i-1,j-1,1,n);
			//cout<<f[j]<<" ";
			for(int k=h[j];k;k=ne[k]){
				int v=e[k];
				//cout<<v<<endl;
				if(st[v]-1>=1) update(1ll,1ll,st[v]-1,1,n,w[v]);
			}
		}
		ans=min(ans,f[n]);
	}
	cout<<ans;
	return 0;
}

提交记录

2025/2/6 11:32
加载中...