传送门

有匹配次数限制,求最小代价,这显然是个费用流的模型.每个点暴力和前面的点连匹配边,边数是\(n^2\)的.

然后发现可以转化成一个set,每次加入一个点,然后入点对set里面的出点连边.这个set可以用主席树实现,然后就主席树优化连边,点数边数都是\(nlogn\)的,然后就能过了

注意这里连边要把一个点入点拆成两个\(a_i,-a_i\),出点同理,然后假设\(a_i\)在set的第\(p\)位,\(a_i\)在负权值主席树上连区间\([1,p-1]\),\(-a_i\)在正权值主席树上连区间\([p+1,n]\)

然后主席树被分治连边吊打

  1. // luogu-judger-enable-o2
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cstdio>
  7. #include<vector>
  8. #include<cmath>
  9. #include<ctime>
  10. #include<queue>
  11. #include<map>
  12. #include<set>
  13. #define LL long long
  14. #define db double
  15. using namespace std;
  16. const int N=1e3+10,M=3e4+10,inf=1<<29;
  17. int rd()
  18. {
  19. int x=0,w=1;char ch=0;
  20. while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
  21. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  22. return x*w;
  23. }
  24. int to[M<<2],nt[M<<2],c[M<<2],hd[M],tot=1;
  25. LL w[M<<2];
  26. void add(int x,int y,int z,LL zz)
  27. {
  28. if(!y) return;
  29. ++tot,to[tot]=y,nt[tot]=hd[x],c[tot]=z,w[tot]= zz,hd[x]=tot;
  30. ++tot,to[tot]=x,nt[tot]=hd[y],c[tot]=0,w[tot]=-zz,hd[y]=tot;
  31. }
  32. LL ans,di[M];
  33. int n,W,a[N],b[N],p[N];
  34. bool cmp(int aa,int bb){return a[aa]<a[bb];}
  35. int ps,pt,fw[M],pr[M];
  36. bool v[M];
  37. queue<int> q;
  38. bool csfl()
  39. {
  40. memset(di,0x3f,sizeof(LL)*(pt+3));
  41. di[ps]=0,v[ps]=1,q.push(ps);
  42. fw[pt]=0;
  43. while(!q.empty())
  44. {
  45. int x=q.front();
  46. q.pop();
  47. for(int i=hd[x];i;i=nt[i])
  48. {
  49. int y=to[i];
  50. if(c[i]>0&&di[y]>di[x]+w[i])
  51. {
  52. di[y]=di[x]+w[i],fw[y]=1,pr[y]=i;
  53. if(!v[y]) v[y]=1,q.push(y);
  54. }
  55. }
  56. v[x]=0;
  57. }
  58. if(!fw[pt]) return 0;
  59. ans+=di[pt];
  60. int x=pt;
  61. while(x!=ps)
  62. {
  63. int i=pr[x];
  64. c[i]-=fw[pt],c[i^1]+=fw[pt];
  65. x=to[i^1];
  66. }
  67. return 1;
  68. }
  69. int rt1,rt2,ch[M][2],t1,t2;
  70. void inst(int o1,int o2,int x,int &tt)
  71. {
  72. int l=1,r=n;
  73. while(l<r)
  74. {
  75. int mid=(l+r)>>1;
  76. if(x<=mid)
  77. {
  78. ch[o1][0]=++tt,ch[o1][1]=ch[o2][1];
  79. add(o1,ch[o1][0],inf,0),add(o1,ch[o1][1],inf,0);
  80. o1=ch[o1][0],o2=ch[o2][0];
  81. r=mid;
  82. }
  83. else
  84. {
  85. ch[o1][0]=ch[o2][0],ch[o1][1]=++tt;
  86. add(o1,ch[o1][0],inf,0),add(o1,ch[o1][1],inf,0);
  87. o1=ch[o1][1],o2=ch[o2][1];
  88. l=mid+1;
  89. }
  90. }
  91. }
  92. void link(int o,int l,int r,int ll,int rr,int x,int y)
  93. {
  94. if(!o) return;
  95. if(ll<=l&&r<=rr){add(x,o,1,y);return;}
  96. int mid=(l+r)>>1;
  97. if(ll<=mid) link(ch[o][0],l,mid,ll,rr,x,y);
  98. if(rr>mid) link(ch[o][1],mid+1,r,ll,rr,x,y);
  99. }
  100. int main()
  101. {
  102. n=rd(),W=rd();
  103. ps=0,pt=n*24+2;
  104. t1=n*2,t2=n*13;
  105. for(int i=1;i<=n;++i) a[i]=rd(),b[i]=i;
  106. sort(b+1,b+n+1,cmp);
  107. for(int i=1;i<=n;++i) p[b[i]]=i;
  108. for(int i=1;i<=n;++i)
  109. {
  110. add(ps,i,1,0),add(i,pt,1,W);
  111. int las;
  112. las=rt1,rt1=++t1,inst(rt1,las,p[i],t1);
  113. las=rt2,rt2=++t2,inst(rt2,las,p[i],t2);
  114. if(p[i]>1) link(rt1,1,n,1,p[i]-1,i,a[i]);
  115. if(p[i]<n) link(rt2,1,n,p[i]+1,n,i,-a[i]);
  116. add(t1,i+n,1,-a[i]),add(t2,i+n,1,a[i]);
  117. add(i+n,pt,1,0);
  118. }
  119. while(csfl());
  120. printf("%lld\n",ans);
  121. return 0;
  122. }

luogu P5331 [SNOI2019]通信的更多相关文章

  1. P5331 [SNOI2019]通信 [线段树优化建图+最小费用最大流]

    这题真让人自闭-我EK费用流已经死了?- (去掉define int long long就过了) 我建的边害死我的 spfa 还是spfa已经死了? 按费用流的套路来 首先呢 把点 \(i\) 拆成两 ...

  2. 洛谷 P5331 - [SNOI2019]通信(CDQ 分治优化建图+费用流)

    题面传送门 首先熟悉网络流的同学应该能一眼看出此题的建模方法: 将每个点拆成两个点 \(in_i,out_i\),连一条 \(S\to in_i\),容量为 \(1\) 费用为 \(0\) 的边 连一 ...

  3. 【LOJ#3097】[SNOI2019]通信(费用流)

    [LOJ#3097][SNOI2019]通信(费用流) 题面 LOJ 题解 暴力就直接连\(O(n^2)\)条边. 然后分治/主席树优化连边就行了. 抄zsy代码,zsy代码是真的短 #include ...

  4. 【洛谷P5331】 [SNOI2019]通信

    洛谷 题意: \(n\)个哨站排成一列,第\(i\)个哨站的频段为\(a_i\). 现在每个哨站可以选择: 直接连接到中心,代价为\(w\): 连接到前面某个哨站\(j(j<i)\),代价为\( ...

  5. 题解 洛谷 P5331 【[SNOI2019]通信】

    考虑用费用流解决本题. 每个哨站看作一个点,并将其拆为两个点,建图方式为: \(S \longrightarrow x_i\) 容量为\(1\),费用为\(0\) \(x_i \longrightar ...

  6. LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图

    瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...

  7. LOJ3097 SNOI2019 通信 题解

    题目链接 费用流,当建边需要依靠位置和权值两个偏序关系时,可以用cdq分治优化建边. 代码: #include<bits/stdc++.h> using namespace std; #d ...

  8. luogu P5371 [SNOI2019]纸牌

    传送门 打麻将+1(雾 有顺子这种东西...注意到以某个位置为开头的顺子数量最多为2,那么有个想法就是枚举以每个位置为开头的顺子个数,然后每个位置的刻子的取法个数为\(\lceil\frac{\tex ...

  9. Luogu P5330 [SNOI2019]数论

    题目 如果\(P>Q\)的话我们先交换一下\(P,Q\). 我们先枚举所有满足第一个条件的数,对于\(x\equiv a_i(mod\ P)\),设\(x=a_i+kP(k\in[0,\lflo ...

随机推荐

  1. Devexpress MVC Gridview

    1. 根据选中的KeyValue 来获取其他field的value // Gridview settings settings.CustomJSProperties = (s, e) => { ...

  2. _vimrc

    set nocompatible source $VIMRUNTIME/vimrc_example.vim source $VIMRUNTIME/mswin.vim behave mswin set ...

  3. docker-compose部署ELK(亲测)

    具体的配置可以参考上面一篇:docker部署ELK 以下是做了一些修改的地方: kibana.yml [root@topcheer config]# cat kibana.yml server.hos ...

  4. SpringMVC学习笔记之---RESTful风格

    RESTful风格 (一)什么是RESTful (1)RESTful不是一套标准,只是一套开发方式,构架思想 (2)url更加简洁 (3)有利于不同系统之间的资源共享 (二)概述 RESTful具体来 ...

  5. 通过ecplise导入mysql的jar包时,右键找不到build path问题

    当我们执行java连接数据库程序的时候,我们需要再我们的项目里导入mysql的jar包,这时,我们需要右键->build path进行导入,但是有时候我们右键的时候并没有出现build path ...

  6. 五大 JAVA Web 框架的优缺点对比,Spring MVC 领先

    毫无疑问,Java 是当今世界上最重要的编程语言之一.js 框架给程序员提供了 一个可以构建程序的坚实基础.它包括定义的类和功能,用于硬件设备管理,与系统软件交互并处理输入,让开发人员变得更轻松.Ja ...

  7. jQuery file upload上传图片出错分析

    以https://github.com/blueimp/jQuery-File-Upload/blob/master/basic-plus.html为例 注释掉load-image.all.min.j ...

  8. Spring+hibernate 配置实例

    转自:http://www.cnblogs.com/hongten/archive/2012/03/10/java_spring_hibernate.html 项目结构: http://www.cnb ...

  9. node_modules .bin文件夹下的文件

    node_modues/.bin文件夹下,对于一个npm包,有两个可执行文件,没有后缀名的是是对应unix系的shell脚本,.cmd文件对应的是windows bat脚本,内容都是用node执行一个 ...

  10. web搜索功能测试

    功能方面: 是否能按指定条件查到正确.完整的结果,具体表现: 1.1录入条件为可查到结果的正常关键字.词.语句,检索到的内容.链接正确性: 1.2录入条件为不可查到结果的关键字.词.语句: 1.3录入 ...