把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

luogu P2605 [ZJOI2010]基站选址

题面传送门
其实这道题可以写得很短的。而且跑得飞快,目前没有手动编译优化第一。感觉完全没有黑题。
如果我们设\(dp_{i,j}\)为到了第\(i\)个基站,当前到了第\(j\)个点时候的最小价值。
那么显然我们有\(dp_{i,j}=\min\limits_{k=0}^{i-1}{dp_{i-1,k}+w(k+1,j)}\)\(w(i,j)\)表示\(i\)点有基站,\(j\)点有基站,中间没有的情况下要赔偿的钱数。这样子是\(O(n^2k)\)的不能过。
如果我们能用某个数据结构维护出后面那个转移就好了。
对于新到每一个节点,我们可以判断出每个节点左右的第一个需要付费的节点。这个可以倍增出来。
然后把右端点扔到vector里去,然后在转移完当前点时把里面的修改拿出来改掉就好了。
时间复杂度\(O(nklogn)\)
code:

#include<cstdio>
#include<cstring>
#include<vector>
#define I inline
#define N 20000
#define K 200
#define l(x) (x<<1)
#define r(x) (x<<1|1)
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int n,m,k,x,y,z,dp[N+5],D[N+5],C[N+5],S[N+5],W[N+5],st[N+5][20],lg[N+5],L[N+5],now,sum[N+5<<2],f[N+5<<2],pus,ans=1e9;
I void up(int x){sum[x]=min(sum[l(x)],sum[r(x)])+f[x];}
I void build(int l=0,int r=n,int now=1){
	f[now]=0;if(l==r) return (void)(sum[now]=dp[l]);int m=l+r>>1;
	build(l,m,l(now));build(m+1,r,r(now));sum[now]=min(sum[l(now)],sum[r(now)]);up(now);
}
I void get(int x,int y,int z,int l=0,int r=n,int now=1){
	if(x<=l&&r<=y) return (void)(f[now]+=z,sum[now]+=z);int m=l+r>>1;
	x<=m&&(get(x,y,z,l,m,l(now)),0);(y>m)&&(get(x,y,z,m+1,r,r(now)),0);up(now);
}
vector<int> g[N+5];
int main(){
	freopen("1.in","r",stdin);freopen("1.out","w",stdout);
	register int i,j,h;scanf("%d%d",&n,&k);
	for(i=2;i<=n;i++) lg[i]=lg[i/2]+1;memset(dp,0x3f,sizeof(dp));dp[0]=0;
	for(i=2;i<=n;i++) scanf("%d",&D[i]);for(i=1;i<=n;i++) scanf("%d",&C[i]);
	for(i=1;i<=n;i++) scanf("%d",&S[i]);for(i=1;i<=n;i++) scanf("%d",&W[i]);
	for(i=1;i<=n;i++){
		for(now=i,j=lg[n];j>=0;j--) (now+(1<<j)-1<=n)&&(D[now+(1<<j)-1]<=D[i]+S[i])&&(now+=(1<<j));g[now-1].push_back(i);
	}
	for(i=1;i<=n;i++){
		now=i;for(j=lg[n];j>=0;j--) ((1<<j)<=now)&&(D[now-(1<<j)+1]>=D[i]-S[i])&&(now-=(1<<j));L[i]=now+1;
	}
	for(i=1;i<=k;i++){
		for(build(),j=1;j<=n;j++){
			dp[j]=sum[1]+C[j];
			for(h=0;h<g[j].size();h++) now=g[j][h],get(0,L[now]-1,W[now]);
		}
		ans=min(sum[1],ans);
	}
	printf("%d\n",ans);
}
posted @ 2021-04-20 21:01  275307894a  阅读(65)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end