有什么问题吗?
查看原帖
有什么问题吗?
766275
IAKIOI2020楼主2024/4/6 17:03

一直WA

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+100;
const int inf=1e18+100;
int n,m,stp,dp[50009];
int dis[N],S[N],W[N],C[N];
int st[N],ed[N]; vector<int>g[N];
struct tree{
	int l,r;
	int mi,lz;
}t[N*2];
#define lson o<<1
#define rson o<<1|1
void push_up(int o){t[o].mi=min(t[lson].mi,t[rson].mi);}
void pushdown(int o){
	if(!t[o].lz) return;
	int x=t[o].lz; t[o].lz=0;
	t[lson].mi+=x,t[lson].lz+=x;
	t[rson].mi+=x,t[rson].lz+=x;
	return;
}
void build(int o,int l,int r){
	t[o].l=l,t[o].r=r;
	if(l==r){
		t[o].mi=dp[l],t[o].lz=0;
		return;
	}
	int mid=(l+r)>>1;
	build(lson,l,mid),build(rson,mid+1,r);
	push_up(o);
	return;
}
void update(int o,int l,int r,int val){
	if(l>r) return;
	if(t[o].l==l and t[o].r==r){
		t[o].mi+=val,t[o].lz+=val;
		return;
	}
	pushdown(o);
	int mid=(t[o].l+t[o].r)>>1;
	if(r<=mid) update(lson,l,r,val);
	else if(l>mid) update(rson,l,r,val);
	else update(lson,l,mid,val),update(rson,mid+1,r,val);
	push_up(o);
	return;
}
int query(int o,int l,int r){
	if(l>r) return inf;
	if(t[o].l==l and t[o].r==r) return t[o].mi;
	pushdown(o);
	int mid=(t[o].l+t[o].r)>>1;
	if(r<=mid) return query(lson,l,r);
	else if(l>mid) return query(rson,l,r);
	else return min(query(lson,l,mid),query(rson,mid+1,r));
}
void deal(){
	for(int i=1;i<=n;i++){
        st[i]=lower_bound(dis+1,dis+1+n,dis[i]-S[i])-dis;
        ed[i]=lower_bound(dis+1,dis+1+n,dis[i]+S[i])-dis;
        if(dis[ed[i]]>dis[i]+S[i])ed[i]--;
       g[ed[i]].push_back(i);
    }
	return;
}
signed main(){
	cin>>n>>m;
	for(int i=2;i<=n;i++) scanf("%lld",&dis[i]);
	for(int i=1;i<=n;i++) scanf("%lld",&C[i]);
	for(int i=1;i<=n;i++) scanf("%lld",&S[i]);
	for(int i=1;i<=n;i++) scanf("%lld",&W[i]);
	n++,m++;
	dis[n]=W[n]=inf;
	deal();
	int ans=inf,now=0;
	for(int i=1;i<=n;i++){
		dp[i]=now+C[i];
		for(int j=0;j<g[i].size();j++) now+=W[g[i][j]];
	}
	ans=min(ans,dp[n]);
	for(int k=2;k<=m;k++){
		build(1,1,n);
		for(int i=1;i<=n;i++){
			dp[i]=query(1,1,i-1)+C[i];
			for(int j=0;j<g[i].size();j++) update(1,1,st[g[i][j]]-1,W[g[i][j]]);
		}
		ans=min(ans,dp[n]);	
	}
	cout<<ans;
	return 0;
}
/* 
dp[i][k]=min{dp[j][k-1]+w(j,i)}+C[i];
dpi,k: 第i个位置放第k个基站
*/
2024/4/6 17:03
加载中...