BZOJ 3532: [Sdoi2014]Lis (最大流)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3532
题意:给出三个数列ABC,长度均为n。删除A中的某些数字,使得A的最长上升子列至少减少1。删掉的数字的代价为相应的B值之和。要求使得代价最小。多组答案时,使得删掉的数字的C值排序的字典序最小。
思路:假设不考虑字典序。那么只要拆点求最小割即可。设f[i]表示到i的最长上升子列。对于两个数字(i,j),若A[i]<A[j]且f[i]+1=f[j],则i向j连边。对于每个点拆开的点连边为B值。
现在要求字典序最小,首先按照C排序,然后从小到大枚举。对于数字x判断其是否在最小割中。若其代表的边(x1,x2)之间的流量为0,且在残留网络中x1不能到达x2,那么x在最小割中。之后还要去掉x这条边。只需要将这条边以及反向边的流量设为0,同时跑(T,x2)(x1,S)的最大流即可,这样可以恢复x原来的边带来的影响。
const int INF=2000000005; const int N=1444; struct node { int v,next; int cap; }; node edges[1100000]; int head[N],e; int curedge[N]; inline void add(int u,int v,int cap) { edges[e].v=v; edges[e].cap=cap; edges[e].next=head[u]; head[u]=e++; } inline void Add(int u,int v,i64 cap) { add(u,v,cap); add(v,u,0); } int S,T; int dis[N]; int Q[N]; int bfs(int s,int t) { clr(dis,-1); int i; for(i=S;i<=T;i++) curedge[i]=head[i]; int L=0,R=0; dis[t]=0; Q[R++]=t; while(L<R) { int u=Q[L++]; for(i=head[u];i!=-1;i=edges[i].next) { if(edges[i^1].cap&&-1==dis[edges[i].v]) { dis[edges[i].v]=dis[u]+1; Q[R++]=edges[i].v; if(edges[i].v==s) return 1; } } } return 0; } int DFS(int u,int det,int t) { if(u==t) return det; int now=0; int i; for(int &i=curedge[u];i!=-1&&det;i=edges[i].next) { int v=edges[i].v; int w=edges[i].cap; if(w&&dis[u]==dis[v]+1) { int tmp=DFS(v,min(w,det),t); if(tmp==0) continue; edges[i].cap-=tmp; edges[i^1].cap+=tmp; now+=tmp; det-=tmp; } } return now; } int dinic(int s,int t) { int ans=0; while(bfs(s,t)) ans+=DFS(s,INF,t); return ans; } pair<int,int> C[777]; int A[777],B[777]; int n; int f[777]; int num[777]; int main() { int cse=getInt(); while(cse--) { n=getInt(); int i; for(i=1;i<=n;i++) A[i]=getInt(); for(i=1;i<=n;i++) B[i]=getInt(); for(i=1;i<=n;i++) C[i].first=getInt(),C[i].second=i; int j; int Max=1; for(i=1;i<=n;i++) { f[i]=1; for(j=1;j<i;j++) if(A[j]<A[i]) f[i]=max(f[i],f[j]+1); Max=max(Max,f[i]); } clr(head,-1); e=0; S=0,T=n+n+1; for(i=1;i<=n;i++) { num[i]=e; Add(i*2-1,i*2,B[i]); if(f[i]==1) Add(S,i*2-1,INF); if(f[i]==Max) Add(i*2,T,INF); for(j=i+1;j<=n;j++) if(A[i]<A[j]&&f[i]+1==f[j]) Add(i*2,j*2-1,INF); } int ans=dinic(S,T); sort(C+1,C+n+1); int a[777],aNum=0; for(i=1;i<=n;i++) { int t=C[i].second; int k=num[t]; if(edges[k].cap!=0) continue; if(bfs(t*2-1,t*2)) continue; dinic(T,t*2); dinic(t*2-1,S); edges[k^1].cap=0; a[++aNum]=C[i].second; } sort(a+1,a+aNum+1); printf("%d %d\n",ans,aNum); for(i=1;i<=aNum;i++) { if(i>1) putchar(' '); printf("%d",a[i]); } puts(""); } }
BZOJ 3532: [Sdoi2014]Lis (最大流)的更多相关文章
- BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)
BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...
- [BZOJ]3532: [Sdoi2014]Lis
Time Limit: 10 Sec Memory Limit: 512 MB Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序 ...
- 3532: [Sdoi2014]Lis 最小字典序最小割
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 865 Solved: 311[Submit][Status] ...
- 3532: [Sdoi2014]Lis
Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去 ...
- bzoj千题计划141:bzoj3532: [Sdoi2014]Lis
http://www.lydsy.com/JudgeOnline/problem.php?id=3532 如果没有字典序的限制,那么DP拆点最小割即可 加上字典序的限制: 按c从小到大枚举最小割边集中 ...
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- [bzoj3532][Sdoi2014]Lis——拆点最小割+字典序+退流
题目大意 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性 ...
- BZOJ3532 [Sdoi2014]Lis 【网络流退流】
题目 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性排序 ...
- Lis(bzoj 3532)
Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出 ...
随机推荐
- sql server output用法说明
带有output的insert语句. @@identity只能返回当前会话最后生产的标识列. 如果一次性插入多条语句的话. 需要返回这些自动生产的标识列. 那么outpu就派上用场了. declar ...
- sp_addlinkedserver 方法应用
EXEC sp_addlinkedserver @server='DBVIP',--被访问的服务器别名 @srvproduct='', @provider='SQLO ...
- TI CC254x BLE教程 2
连接更新请求(connection update request) 如果slave不满意现有的连接参数, 比如间隔, 延迟等等, 可以向master提出自己希望的参数范围 连接终止(connectio ...
- Linux之awk命令详解
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- 使用ActionFilterAttribute 记录 WebApi Action 请求和返回结果记录
使用ActionFilterAttribute 记录 WebApi Action 请求和返回结果记录 C#进阶系列——WebApi 异常处理解决方案 [ASP.NET Web API教程]4.3 AS ...
- jstl简介
JavaServer Page Standard Tag Library是一个有用的JSP标签的集合,它封装了许多JSP应用程序通用的核心功能. JSTL支持常见的,结构性任务,如迭代和条件,标签为操 ...
- [ERROR][org.springframework.web.context.ContextLoader][main] Context initialization failed org.sprin
做一个SSH为基础框架的webapp小DEMO,复制了一把以前可以跑的代码,竟发现无法初始化数据源,报错如下: [ERROR][org.springframework.web.context.Cont ...
- JS参数传值
1.JS获取URL参数值 //js获取url参数值 function request(paras) { var url = location.href; , url.length).split(&qu ...
- Java实现批量修改文件名称
import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; /** ...
- syntactically incorrect() 404
遇到这个错误就来记录一下吧. 这个错误是springMVC报出的错误.大致的意思就是form传值的类型和controller中的参数不符. 有可能是名字错误,有可能是类型不对.比如前面你传来的是 p ...