Time Limit: 10 Sec  Memory Limit: 512 MB

Description

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

  如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种。

Input

  输入包含多组数据。
  输入的第一行包含整数T,表示数据组数。接下来4*T行描述每组数据。
  每组数据的第一行包含一个整数N,表示A的项数,接下来三行,每行N个整数A1..An,B1.,Bn,C1..Cn,满足1 < =Ai,Bi,Ci < =10^9,且Ci两两不同。

Output

  对每组数据,输出两行。第一行包含两个整数S,M,依次表示删去项的代价和与数量;接下来一行M个整数,表示删去项在4中的的位置,按升序输出。

Sample Input

  1
  6
  3 4 4 2 2 3
  2 1 1 1 1 2
  6 5 4 3 2 1

Sample Output

  4 3
  2 3 6
  解释:删去(A2,43,A6),(A1,A6),(A2,43,44,A5)等都是合法的方案,但
  {A2,43,A6)对应的C值的字典序最小。

HINT

  1 < =N < =700     T < =5

Solution

  先从后往前DP求出f[i]表示以a[i]开头的最长上升子序列长度。根据DP转移路径建出最小割模型:若f[i]=A的最长上升子序列长度,S到i连INF;若f[i]=1,i到T连INF;若j能转移到i,i向j连INF,每个点再拆成两个点,边权为bi。考虑如何求出字典序最小的最小割,按ci从小到大贪心,如果i拆出的边能作为割边,即拆出的两个点只走未满流边不能互相到达,那么选进答案,并且我们要消除这条边对之后的影响,就让入点到S跑一遍最大流,T到出点也跑一遍最大流,这样流到这条边的流量就都被退了回去。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=x*+c-'';
return x;
}
#define MN 700
#define MV 1400
#define ME 250000
#define INF 0x7FFFFFFF
struct edge{int nx,t,w;}e[ME*+];
int A[MN+],B[MN+],C[MN+],f[MN+],p[MN+],as[MN+],an;
int S,T,h[MV+],en,d[MV+],q[MV+],qn,c[MV+];
bool cmp(int a,int b){return C[a]<C[b];}
inline void ins(int x,int y,int w)
{
e[++en]=(edge){h[x],y,w};h[x]=en;
e[++en]=(edge){h[y],x,};h[y]=en;
}
bool bfs()
{
int i,j;
memset(d,,sizeof(d));
for(d[q[i=qn=]=S]=;i<=qn;++i)for(j=c[q[i]]=h[q[i]];j;j=e[j].nx)
if(e[j].w&&!d[e[j].t])d[q[++qn]=e[j].t]=d[q[i]]+;
return d[T];
}
int dfs(int x,int r)
{
if(x==T)return r;
int k,u=;
for(int&i=c[x];i;i=e[i].nx)if(e[i].w&&d[e[i].t]==d[x]+)
{
k=dfs(e[i].t,min(e[i].w,r-u));
u+=k;e[i].w-=k;e[i^].w+=k;
if(u==r)return u;
}
return d[x]=,u;
}
int main()
{
int t=read(),n,i,j,ans;
while(t--)
{
n=read();
for(i=;i<=n;++i)A[i]=read();
for(i=;i<=n;++i)B[i]=read();
for(i=;i<=n;++i)C[i]=read();
for(i=n;i>=;++f[i--])
for(f[i]=,j=n;j>i;--j)if(A[j]>A[i])f[i]=max(f[i],f[j]);
S=MV+;T=MV+;memset(h,,sizeof(h));en=;
for(i=;i<=n;p[i]=i,++i)
{
ins(i,i+n,B[i]);
if(f[i]+==f[])ins(S,i,INF);
if(f[i]==)ins(i+n,T,INF);
for(j=i;++j<=n;)if(A[j]>A[i]&&f[i]==f[j]+)ins(i+n,j,INF);
}
for(ans=;bfs();)ans+=dfs(S,INF);
sort(p+,p+n+,cmp);
for(an=,i=;i<=n;++i)
{
if(S=p[i],T=S+n,bfs())continue;
as[++an]=p[i];
for(T=MV+;bfs();)dfs(S,INF);
for(T=p[i]+n,S=MV+;bfs();)dfs(S,INF);
}
sort(as+,as+an+);
printf("%d %d\n",ans,an);
for(i=;i<=an;++i)printf("%d%c",as[i],i<an?' ':'\n');
}
}

[BZOJ]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. BZOJ 3532: [Sdoi2014]Lis (最大流)

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

  3. 3532: [Sdoi2014]Lis 最小字典序最小割

    3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status] ...

  4. 3532: [Sdoi2014]Lis

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

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

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

  6. Lis(bzoj 3532)

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

  7. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  8. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  9. BZOJ3532 : [Sdoi2014]Lis

    f[i]表示以i为结尾的LIS长度 对于所有f[i]=1的,由S向i连边 对于所有f[i]=maxf的,由i向T连边 对于j<i,a[j]<a[i],且f[j]+1=f[i]的,j向i连边 ...

随机推荐

  1. c语言字符类型作业

    一.PTA实验作业 题目1:7-2 统计一行文本的单词个数 1. 本题PTA提交列表 2. 设计思路 1.定义整形变量i=0,count=0,flag. 2.定义数组str[999] 3.输入str[ ...

  2. Software Engineering-HW3 264&249

    title: Software Engineering-HW3 date: 2017-10-05 10:04:08 tags: HW --- 小组成员 264 李世钰 249 王成科 项目地址 htt ...

  3. 20162318 实验四 Android程序设计

    北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623班 姓名:张泰毓 指导老师:娄老师.王老师 实验日期:2017年5月26日 实验密级:非密级 实验器材:带Lin ...

  4. Java 密码学算法

    Java 密码学算法 候捷老师在< 深入浅出MFC 2e(电子版)>中引用林语堂先生的一句话: 只用一样东西,不明白它的道理,实在不高明 只知道How,不知道Why,出了一点小问题时就无能 ...

  5. Alpha冲刺Day8

    Alpha冲刺Day8 一:站立式会议 今日安排: 经过为期5天的冲刺,基本完成企业人员模块的开发.因第三方机构与企业存在委托的关系.第三方人员对于风险的自查.风险列表的展示以及自查风险的统计展示(包 ...

  6. Linux 目录与文件管理

    1. 目录与路径1.1 相对路径与绝对路径1.2 目录的相关操作: cd, pwd, mkdir, rmdir1.3 关于执行文件路径的变量: $PATH2. 档案与目录管理2.1 档案与目录的检视: ...

  7. Java如何调取创蓝253短信验证码

    基于创蓝253短信服务平台的Java调用短信接口API package com.bcloud.msg.http; import java.io.ByteArrayOutputStream; impor ...

  8. 从PRISM开始学WPF(二)Prism?

    目录: 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Modu ...

  9. 初学深度学习(TensorFlow框架的心得and经验总结)自用环境的总结

    初学者的时间大部分浪费在了环境上了: 建议直接上Linux系统,我推荐国产的深度系统,deepin这几年一直在不断的发展,现在15.4已经很不错了 1,图形化界面很漂亮,内置正版crossover,并 ...

  10. Java+Maven+selenium+testing+reportNG自动化测试框架

    最近公司新出了一个产品,需要搭建自动化测试框架,这是一个学以至用的好机会,跟上级申请后,决定搭建一个java自动化测试框架. Java自动化测试对我来讲可以说不难不易,因为java是我大学在校四年学的 ...