主席树+决策单调,重写一遍比之前短多了……题解:http://www.cnblogs.com/liu-runda/p/6051422.html

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<vector>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=;
  7. int n;
  8. struct node{
  9. int sum;node* ch[];
  10. node(){}
  11. node(int x){sum=x;ch[]=ch[]=;}
  12. }t[maxn*],*root[maxn];int cnt=;
  13. node* newnode(int x){t[++cnt]=node(x);return t+cnt;}
  14. void Insert(node* rt0,node* &rt,int l,int r,int k,int x){
  15. rt=new node(rt0->sum+x);
  16. if(l==r)return;
  17. int mid=(l+r)>>;
  18. if(k<=mid){
  19. Insert(rt0->ch[],rt->ch[],l,mid,k,x);
  20. rt->ch[]=rt0->ch[];
  21. }else{
  22. Insert(rt0->ch[],rt->ch[],mid+,r,k,x);
  23. rt->ch[]=rt0->ch[];
  24. }
  25. }
  26. int query(node* rt0,node* rt1,int l,int r,int ql,int qr){
  27. if(ql>qr)return ;
  28. if(ql<=l&&r<=qr)return rt1->sum-rt0->sum;
  29. int mid=(l+r)>>,ans=;
  30. if(ql<=mid)ans+=query(rt0->ch[],rt1->ch[],l,mid,ql,qr);
  31. if(qr>mid) ans+=query(rt0->ch[],rt1->ch[],mid+,r,ql,qr);
  32. return ans;
  33. }
  34. int f[][maxn];
  35. int d[maxn],c[maxn],s[maxn],w[maxn];
  36. struct data{
  37. int l,r,w;
  38. }range[maxn];
  39. vector<data> D[maxn];
  40. void solve(int j,int l,int r,int L,int R){
  41. if(l>r)return;
  42. int mid=(l+r)>>,g=;
  43. f[j][mid]=0x7fffffff;
  44. for(int i=L;i<=R&&i<mid;++i){
  45. int tmp=f[j-][i]+query(root[i],root[mid-],,n,i+,mid-)+c[mid];
  46. if(tmp<f[j][mid]){
  47. f[j][mid]=tmp;g=i;
  48. }
  49. }
  50. solve(j,l,mid-,L,g);solve(j,mid+,r,g,R);
  51. }
  52. int main(){
  53. int k;scanf("%d%d",&n,&k);
  54. d[]=0x80808080;d[n+]=0x7fffffff;
  55. for(int i=;i<=n;++i)scanf("%d",&d[i]);
  56. for(int i=;i<=n;++i)scanf("%d",&c[i]);
  57. for(int i=;i<=n;++i)scanf("%d",&s[i]);
  58. for(int i=;i<=n;++i)scanf("%d",&w[i]);
  59. for(int i=;i<=n;++i){
  60. range[i].l=lower_bound(d,d+n+,d[i]-s[i])-d;range[i].r=upper_bound(d,d+n+,d[i]+s[i])-d-;
  61. range[i].w=w[i];
  62. D[range[i].l].push_back(range[i]);
  63. }
  64. root[]=t+;root[]->ch[]=root[]->ch[]=t+;root[]->sum=;
  65. for(int i=;i<=n;++i){
  66. root[i]=root[i-];
  67. for(vector<data>::iterator pt=D[i].begin();pt!=D[i].end();++pt){
  68. Insert(root[i],root[i],,n,pt->r,pt->w);
  69. }
  70. }
  71. root[n+]=root[n];
  72. int ans=;for(int i=;i<=n;++i)ans+=w[i];
  73. for(int i=;i<=n;++i){
  74. f[][i]=query(root[],root[i-],,n,,i-)+c[i];//printf("...%d\n",f[1][i]);
  75. ans=min(ans,f[][i]+query(root[i],root[n],,n,i+,n));//printf("%d\n",ans);
  76. }//printf("%d\n",ans);
  77. for(int j=;j<=k;++j){
  78. solve(j,,n,,n);
  79. for(int i=;i<=n;++i)ans=min(ans,f[j][i]+query(root[i],root[n],,n,i+,n));
  80. }
  81. printf("%d\n",ans);
  82. return ;
  83. }

bzoj1835[ZJOI2010]基站选址的更多相关文章

  1. BZOJ1835 [ZJOI2010] 基站选址 【动态规划】【线段树】

    题目分析: 首先想一个DP方程,令f[m][n]表示当前在前n个村庄选了m个基站,且第m个基站放在n处的最小值,转移可以枚举上一个放基站的村庄,然后计算两个村庄之间的代价. 仔细思考两个基站之间村庄的 ...

  2. 【题解】Luogu P2605 [ZJOI2010]基站选址

    原题传送门:P2604 [ZJOI2010]基站选址 看一眼题目,变知道这题一定是dp 设f[i][j]表示在第i个村庄修建第j个基站且不考虑i+1~n个村庄的最小费用 可以得出f[i][j] = M ...

  3. 【BZOJ1835】基站选址(线段树)

    [BZOJ1835]基站选址(线段树) 题面 BZOJ 题解 考虑一个比较暴力的\(dp\) 设\(f[i][j]\)表示建了\(i\)个基站,最后一个的位置是\(j\)的最小代价 考虑如何转移\(f ...

  4. 【LG2605】[ZJOI2010]基站选址

    [LG2605][ZJOI2010]基站选址 题面 洛谷 题解 先考虑一下暴力怎么写,设\(f_{i,j}\)表示当前\(dp\)到\(i\),且强制选\(i\),目前共放置\(j\)个的方案数. 那 ...

  5. 题解 [ZJOI2010]基站选址

    题解 [ZJOI2010]基站选址 题面 解析 首先考虑一个暴力的DP, 设\(f[i][k]\)表示第\(k\)个基站设在第\(i\)个村庄,且不考虑后面的村庄的最小费用. 那么有\(f[i][k] ...

  6. luogu P2605 [ZJOI2010]基站选址 线段树优化dp

    LINK:基站选址 md气死我了l达成1结果一直调 显然一个点只建立一个基站 然后可以从左到右进行dp. \(f_{i,j}\)表示强制在i处建立第j个基站的最小值. 暴力枚举转移 复杂度\(n\cd ...

  7. [ZJOI2010]基站选址,线段树优化DP

    G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较   题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...

  8. BZOJ1835,LG2605 [ZJOI2010]基站选址

    题意 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为\(D_i\) 需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为\(C_i\) 如果在距离第i个村 ...

  9. Bzoj1835:[ZJOI2010]基站选址

    Sol 设\(f[i][j]\)表示钦定\(i\)建基站,建了\(j\)个基站的最小代价 \(f[i][j]=max(f[l][j-1]+\Sigma_{t=l+1}^{i-1}\)不能影响到的村庄的 ...

随机推荐

  1. 北京Uber优步司机奖励政策(3月22日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 四、新时间日期API

    一.使用 LocalDate .LocalTime .LocalDateTime LocalDate.LocalTime.LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-86 ...

  3. L010小结后自考题

    . 查询2号分区的inode和block的数量和尺寸 . 在lcr文件夹下创建一个a文件夹,然后进入文件夹中,创建3个3层目录,5个1层目录,5个文件 . 滤出a文件夹下的所有一级目录(4种方法) . ...

  4. Ruby 基础教程1-7

    函数: foo(x,y,z) foo(x,*args) foo(x,*args,c) foo(x=0,y="a") 2.0以后参数可以关键字指定 foo(x:0,y:0,z:0) ...

  5. lesson 14 A noble gangster

    lesson 14 A noble gangster there was a ++time++ 时期 times 时期/年代 in times of peace a sum of + money 一笔 ...

  6. leetcode合并区间

    合并区间     给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...

  7. CSP201503-2:数字排序

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  8. MySQL数据库怎么截取字符串?

    函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...

  9. [Clr via C#读书笔记]Cp10属性

    Cp10属性 属性的本质就是方法,只是看起来像字段罢了: 无参属性 就是一般属性: 字段一般要private,然后通过设置访问方法-访问器来访问:属性是方法语法变种:getset不一定要访问支持字段: ...

  10. springMVC对jsp页面的数据进行校验

    一. 使用注解校验 a) 引入校验依赖包 <dependency> <groupId>javax.validation</groupId> <artifact ...