[BZOJ1835]基站选址(线段树) 题面 BZOJ 题解 考虑一个比较暴力的\(dp\) 设\(f[i][j]\)表示建了\(i\)个基站,最后一个的位置是\(j\)的最小代价 考虑如何转移\(f[i][j]=min(f[i-1][p]+Cost(p+1,j)+C[j])\) 其中\(Cost\)表示代价,也就是区间内所有没有被覆盖的村庄的\(W\)的和 如果直接暴力\(dp\),复杂度\(O(n^2k)\),这个复杂度还假设了\(Cost\)是\(O(1)\)计算的 转移的时候是枚举建造的…
点此看题面 大致题意: 有\(n\)个村庄,每个村庄有\(4\)个属性:\(D_i\)表示与村庄\(1\)的距离,\(C_i\)表示建立基站的费用,\(S_i\)表示能将其覆盖的建基站范围,\(W_i\)表示没建设基站所要付出的代价. 暴力\(DP\) 首先我们来考虑一波暴力\(DP\). 设\(f_{i,j}\)为在前\(i\)村庄共建\(j\)个基站且第\(i\)个村庄必选所需的最小代价. 为了方便起见,我们定义它不管其之后的代价. 而这样统计答案又略显麻烦. 因此我们可以考虑在最后增加一个…
题目传送门 需要高级权限的传送门 题目大意 有$n$个村庄坐落在一条直线上,第$i \ \ \ (i>1)$个村庄距离第$1$个村庄的距离为$D_i$.需要在这些村庄中建立不超过$K$个通讯基站,在第$i$个村庄建立基站的费用为$C_i$.如果在距离第$i$个村庄不超过$S_i$的范围内建立了一个通讯基站,那么就成它被覆盖了.如果第$i$个村庄没有被覆盖,则需要向他们补偿,费用为$W_i$.现在的问题是,选择基站的位置,使得总费用最小. 三方dp是显然的,用$f_{i, j}$表示考虑前$i$个…
坑待填. \(Code\ Below:\) #include <bits/stdc++.h> #define lson (rt<<1) #define rson (rt<<1|1) using namespace std; const int maxn=20000+10; const int inf=0x3f3f3f3f; int n,k,d[maxn],c[maxn],s[maxn],w[maxn],f[maxn],st[maxn],ed[maxn],sum[maxn…
题目分析: 首先想一个DP方程,令f[m][n]表示当前在前n个村庄选了m个基站,且第m个基站放在n处的最小值,转移可以枚举上一个放基站的村庄,然后计算两个村庄之间的代价. 仔细思考两个基站之间村庄的代价,会发现对于一个村庄,它需要付出代价的时候当且仅当上一个基站控制不到它,下一个基站也控制不到它,所以可以计算使它不付出代价的基站区间,然后在超过这段区间的时候加影响.具体来说就是在线段树上面加w[i].注意滚动数组. 代码: #include<bits/stdc++.h> using name…
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄不超过Si的范围内建立了一个通讯基站,那么就成它被覆盖了.如果第i个村庄没有被覆盖,则需要向他们补偿,费用为Wi.现在的问题是,选择基站的位置,使得总费用最小. 输入数据 (base.in) 输入文件的第一行包含两个整数N,K,含义如上所述. 第二行包含N-1个整数,分别表示D2,D3,-,DN ,这N-…
传送门 二分出每个点不需要付www贡献的范围,然后可以推出转移式子: f[i][j]=f[i−1][k]+value(k+1,j)+c[i]f[i][j]=f[i-1][k]+value(k+1,j)+c[i]f[i][j]=f[i−1][k]+value(k+1,j)+c[i],把c[i]c[i]c[i]提出来发现前面的可以用线段树优化转移. 于是每次选一个数相当于区间加,再维护一个区间查询最小值转移就行了. 代码: #include<bits/stdc++.h> #define lc (p…
传送门 题意 有 $ n $ 个村庄在一排直线上,现在要建造不超过 $ K $ 个通讯基站,基站只能造在村庄处. 第 $ i $ 个村庄距离第 $ 1 $ 个村庄的距离为 $ D_i $ .在此建造基站的费用为 $ C_i $ .如果在此不超过 $ S_i $ 的范围内有基站,那么这个村庄就被覆盖了.如果它没有被覆盖,则需要花费 $ W_i $ 的补偿费用. 问你最小总花费是多少. 题解 首先有一个很显然的dp: $ dp[i][j] $ 表示在第 $ i $ 个村庄建了基站,此时一共建了 $…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1835 题意:有N个村庄坐落在一条直线上,第 i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村 庄不超过Si的范围内建立了一个通讯基站,那么就成它被覆盖了.如果第i个村庄没有被覆盖,则需要向他们补偿,费用为Wi.现在的问题是,选择基站的位 置,使得总费用最小. 思路: 另外,程序中的n=n+1,m=…
主席树+决策单调,重写一遍比之前短多了……题解:http://www.cnblogs.com/liu-runda/p/6051422.html #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; ; int n; struct node{ ]; node(){} node(]=ch[]=;} }t[maxn*],*root[m…