3532: [Sdoi2014]Lis

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 865  Solved: 311
[Submit][Status][Discuss]

Description

给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci。请删除若
干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案。
如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种。

这题难点在如何求一组最小字典序最小的最小割。

一条边是一种割集中的一条边当且仅当它在任何最大流方案中都是满流。

即它当前满流且从这条边的出点到入点找不到增广路。

当确定一条边必须在边集中后,从出点向S增广,从T向入点增广,再把容量清零,相当于把这条边删掉。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<vector>
  6. #include<queue>
  7. #define ll long long
  8. #define inf 0x3f3f3f3f
  9. #define N 1405
  10. #define M 1000005
  11. using namespace std;
  12. vector<int>ss;
  13. int head[N],ver[M],nxt[M],f[M],tot;
  14. void add(int a,int b,int c)
  15. {
  16. tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;f[tot]=c;
  17. tot++;nxt[tot]=head[b];head[b]=tot;ver[tot]=a;f[tot]=0;return ;
  18. }
  19. queue<int>q;int ch[N];
  20. int S,T;
  21. bool tell()
  22. {
  23. memset(ch,-1,sizeof(ch));
  24. q.push(S);ch[S]=0;
  25. while(!q.empty())
  26. {
  27. int tmp=q.front();q.pop();
  28. for(int i=head[tmp];i;i=nxt[i])
  29. {
  30. if(f[i]&&ch[ver[i]]==-1)
  31. {
  32. ch[ver[i]]=ch[tmp]+1;
  33. q.push(ver[i]);
  34. }
  35. }
  36. }
  37. return ch[T]!=-1;
  38. }
  39. ll zeng(int a,int b)
  40. {
  41. if(a==T)return b;
  42. int r=0;
  43. for(int i=head[a];i!=0&&b>r;i=nxt[i])
  44. {
  45. if(f[i]&&ch[ver[i]]==ch[a]+1)
  46. {
  47. int t=zeng(ver[i],min(f[i],b-r));
  48. f[i]-=t;f[i^1]+=t;r+=t;
  49. }
  50. }
  51. if(!r)ch[a]=-1;
  52. return r;
  53. }
  54. ll dinic()
  55. {
  56. ll r=0,t;
  57. while(tell())
  58. {
  59. while(t=zeng(S,inf))
  60. {
  61. r+=t;
  62. }
  63. }
  64. return r;
  65. }
  66. int n,a[N],b[N],c[N];
  67. int p[N],dp[N];
  68. bool cmp(int x,int y)
  69. {
  70. return c[x]<c[y];
  71. }
  72. int main()
  73. {
  74. int cas;
  75. scanf("%d",&cas);
  76. while(cas--)
  77. {
  78. memset(head,0,sizeof(head));
  79. memset(dp,0,sizeof(dp));
  80. ss.clear();
  81. scanf("%d",&n);tot=1;// i i*2 i*2+1
  82. for(int i=1;i<=n;i++)scanf("%d",&a[i]);
  83. for(int i=1;i<=n;i++)scanf("%d",&b[i]);
  84. for(int i=1;i<=n;i++)scanf("%d",&c[i]),add(i,i+n,b[i]);
  85. for(int i=1;i<=n;i++)p[i]=i;
  86. sort(p+1,p+n+1,cmp);int mx=0;
  87. for(int i=1;i<=n;i++)
  88. {
  89. dp[i]=1;
  90. for(int j=1;j<i;j++)
  91. {
  92. if(a[i]>a[j])dp[i]=max(dp[i],dp[j]+1);
  93. }
  94. mx=max(mx,dp[i]);
  95. }
  96. S=0;T=2*n+1;
  97. for(int i=1;i<=n;i++)if(dp[i]==mx)add(i+n,T,inf);
  98. for(int i=1;i<=n;i++)if(dp[i]==1)add(S,i,inf);
  99. for(int i=1;i<=n;i++)
  100. {
  101. for(int j=1;j<i;j++)
  102. {
  103. if(a[i]>a[j]&&dp[i]==dp[j]+1)
  104. {
  105. add(j+n,i,inf);
  106. }
  107. }
  108. }
  109. ll ans1=dinic();
  110. for(int i=1;i<=n;i++)
  111. {
  112. int x=p[i];
  113. S=x;T=x+n;
  114. if(f[x*2]||tell())continue;
  115. S=x;T=0;dinic();
  116. S=2*n+1;T=x+n;dinic();
  117. ss.push_back(x);
  118. f[x*2]=f[x*2+1]=0;
  119. }
  120. sort(ss.begin(),ss.end());
  121. printf("%lld %d\n",ans1,ss.size());
  122. for(int i=0;i<ss.size();i++)
  123. {
  124. printf("%d%c",ss[i]," \n"[i==ss.size()-1]);
  125. }
  126. }
  127. return 0;
  128. }

  

 
 

3532: [Sdoi2014]Lis 最小字典序最小割的更多相关文章

  1. BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)

    BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...

  2. [bzoj3532][Sdoi2014]Lis——拆点最小割+字典序+退流

    题目大意 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性 ...

  3. BZOJ 3532: [Sdoi2014]Lis (最大流)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3532 题意:给出三个数列ABC,长度均为n.删除A中的某些数字,使得A的最长上升子 ...

  4. [BZOJ]3532: [Sdoi2014]Lis

    Time Limit: 10 Sec  Memory Limit: 512 MB Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序 ...

  5. 3532: [Sdoi2014]Lis

    Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去 ...

  6. bzoj千题计划141:bzoj3532: [Sdoi2014]Lis

    http://www.lydsy.com/JudgeOnline/problem.php?id=3532 如果没有字典序的限制,那么DP拆点最小割即可 加上字典序的限制: 按c从小到大枚举最小割边集中 ...

  7. POJ1815 Friendship(字典序最小最小割割边集)

    看了题解.当时也觉得用邻接矩阵挺好写的,直接memset:然而邻接矩阵不懂得改,于是就放开那个模板,写了Dinic.. 方法是,按字典序枚举每一条满流的边,然后令其容量减1,如果最大流改变了,这条边就 ...

  8. poj 1815 Friendship 字典序最小+最小割

    题目链接:http://poj.org/problem?id=1815 In modern society, each person has his own friends. Since all th ...

  9. BZOJ1046 [HAOI2007]上升序列 【LIS + 字典序最小】

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5410  Solved: 1877 [Submit][St ...

随机推荐

  1. linux的date命令使用指定时间的加减方法与异常

    在一般网页里,date命令减时间方法为: date -d '-100 days' 我的需求是,在指定时间上减8小时.按一般理解来看,命令写成如下样子(有异常错误的写法): date -d " ...

  2. asp.net core如何修改程序监听的端口

    asp.net core 默认监听的5000和5001端口,要修改为其他端口有几种方法. 1.硬编码.优点是直观,缺点是每次修改端口都得重新编译程序. public class Program { p ...

  3. Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法

      #1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...

  4. HDFS handler

    http://docs.oracle.com/goldengate/bd1221/gg-bd/GADBD/GUID-85A82B2E-CD51-463A-8674-3D686C3C0EC0.htm#G ...

  5. zookeeper客户端相关命令

    windows环境:    本机 直接 点机zkcli.cmd linux环境: 连接到zookeeper server ./zkCli.sh -server localhost:2181 help命 ...

  6. OO第三阶段作业总结

    调研:        最早的程序设计是直接采用机器语言来编写的,或者使用二进制码来表示机器能够识别和执行的指令和数据.机器语言的优点在于速度快,缺点在于写起来实在是太困难了,编程效率低,可读性差,并且 ...

  7. centos6 安装图形化界面

    1.首先进行光盘的挂载,注意光盘挂载时不会自动建立目录的,所以需要自己建立目录 mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom #dev目录为设备目录 2.更 ...

  8. 初学Cocos2dx

    初学cocos2dx Cocos2dx 中的主要概念包括:应用.导演.场景.层.精灵.动画.动作. Cocos2dx里面的主要类 1.CCObject Object Object Object 是co ...

  9. Task 6.2站立会议一

    今天大家把这两天查的资料都拿出来整合到了一起,并仔细分析了其中的联系和区别. 因为大家每个人的思路都不一样,有各种各样的想法和不同的意见,所以最终统一意见是很难的一个过程.开始大家认我们可以做一个单独 ...

  10. dsdsd

    #include<iostream> using namespace std; #include<string.h> #define max 205 char map[max] ...