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

/*如果没有字典序最小的要求,建图跑最小割。建图方法:S向i连一条容量为inf的边;i'向T连一条容量为inf的边;i向i'连一条容量为b[i]的边;如果a[i]<a[j]&&f[i]+1=f[j],i'向j连一条容量为inf的边。现在有字典序最小的要求,那么有字典序从小到大枚举删哪条边,删一条边<u,v>的方法是:退流,u向S跑一遍最大流,,T向v跑一遍最大流,然后这条边流量清零就行了。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define N 710
#define inf 1000000000
using namespace std;
int a[N],b[N],f[N],head[N],dis[N],n,cnt,ans[N];
struct Node{int num,id;}c[N];
struct node{int v,f,pre;}e[N*N];
queue<int> q;
bool cmp(const Node&x,const Node&y){return x.num<y.num;}
void add(int u,int v,int f){e[++cnt].v=v;e[cnt].f=f;e[cnt].pre=head[u];head[u]=cnt;e[++cnt].v=u;e[cnt].f=0;e[cnt].pre=head[v];head[v]=cnt;
}
bool bfs(int S,int T){memset(dis,-1,sizeof(dis));q.push(S);dis[S]=0;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i;i=e[i].pre)if(e[i].f&&dis[e[i].v]==-1){dis[e[i].v]=dis[u]+1;q.push(e[i].v);}}return dis[T]!=-1;
}
int dfs(int x,int f,int T){if(x==T||f==0) return f;int rest=f;for(int i=head[x];i;i=e[i].pre)if(e[i].f&&dis[e[i].v]==dis[x]+1){int v=dfs(e[i].v,min(rest,e[i].f),T);if(!v) dis[e[i].v]=-1;e[i].f-=v;e[i^1].f+=v;rest-=v;}if(f==rest) dis[x]=0;return f-rest;
}
int dinic(int S,int T){int ans=0;while(bfs(S,T)) ans+=dfs(S,inf,T);return ans;
}
int DP(){int maxf=0;for(int i=1;i<=n;i++){int maxn=0;for(int j=0;j<i;j++)if(a[j]<a[i]) maxn=max(maxn,f[j]);f[i]=maxn+1;maxf=max(maxf,f[i]);}return maxf;
}
void build(int S,int T){int maxf=DP();for(int i=1;i<=n;i++) add(i,i+n,b[i]);for(int i=1;i<=n;i++){if(f[i]==1) add(S,i,inf);else if(f[i]==maxf) add(i+n,T,inf);for(int j=i+1;j<=n;j++)if(a[i]<a[j]&&f[i]+1==f[j])add(i+n,j,inf);}
}
int main(){int Q;scanf("%d",&Q);while(Q--){memset(head,0,sizeof(head));cnt=1;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) scanf("%d",&b[i]);for(int i=1;i<=n;i++) scanf("%d",&c[i].num),c[i].id=i;int S=0,T=n*2+1;build(S,T);int maxflow=dinic(S,T);sort(c+1,c+n+1,cmp);int tot=0;for(int i=1;i<=n;i++){int u=c[i].id,v=u+n;if(bfs(u,v)) continue;ans[++tot]=u;dinic(u,S);dinic(T,v);e[u*2].f=e[u*2+1].f=0;}sort(ans+1,ans+tot+1);printf("%d %d\n",maxflow,tot);for(int i=1;i<=tot;i++)printf("%d%c",ans[i],i==tot?'\n':' ');}return 0;
}

转载于:https://www.cnblogs.com/harden/p/6720315.html

Lis(bzoj 3532)相关推荐

  1. 分裂游戏(bzoj 1188)

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...

  2. ZOJ 4028 15th浙江省省赛E. LIS(神奇贪心)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4028 题意: 有一个长度为n的序列A,你不知道这个序列的中每个元 ...

  3. 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子

    有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...

  4. 飞镖(bzoj 2335)

    Description 飞镖是在欧洲颇为流行的一项运动.它的镖盘上分为20个扇形区域,分别标有1到20的分值,每个区域中有单倍.双倍和三倍的区域,打中对应的区域会得到分值乘以倍数所对应的分数.例如打中 ...

  5. OSU!(bzoj 4318)

    Description osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...

  6. 亚瑟王(bzoj 4008)

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

  7. GT考试(bzoj 1009)

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...

  8. 切糕(bzoj 3144)

    Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...

  9. 文本生成器(bzoj 1030)

    Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...

最新文章

  1. 微软创立全新人工智能实验室,与DeepMind、OpenAI同台竞技
  2. 评估微型计算机的主要指标,微型计算机的工作过程和主要性能指标.doc
  3. HTTP-post请求重定向后变成了GET请求
  4. 内存缓存MemoryCache
  5. c#web页面显示弹窗_基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用
  6. Cheatsheet: 2015 03.01 ~ 03.31
  7. MNIST机器学习入门
  8. matlab gpu 编程 macOS,MATLAB GPU编程基础
  9. ubuntu安装过程中遇到的一些问题及解决办法。
  10. 光纤非线性效应对光OFDM信号的影响研究
  11. 论模式在领域驱动设计中的重要性
  12. datagrid.columns有没有图片图片属性_天龙八部:86四属性神器在线求超越,原来逍遥扇子还能这么洗...
  13. 计算机鼠标双击怎么,电脑鼠标双击变成属性的解决方法
  14. java wsimport 调用_java使用wsimport调用wcf接口
  15. php8新特性全览【超详细】
  16. 解决cannot find grldr in all devices问题
  17. 电脑常用快捷键的使用
  18. Ubuntu防火墙ufw规则配置
  19. lmproperly specified vM option.To fix the proble Android studio JVM启动错误
  20. 解决VMware Workstation 与 Hyper-V 不兼容。请先从系统中移除 Hyper-V 角色,然后再运行 VMware Workstation。

热门文章

  1. iOS 应用安全权威指南电子书 PDF 分享
  2. 解决 LLVM 错误提示 may only occur zero or one times!
  3. CentOS生成自签名证书配置Apache https
  4. linux操作系统adsl 上网设置,Linux操作系统下ADSL拨号上网详细步骤
  5. TCP中的RTT和RTO
  6. 关于ViewTreeObserver的理解
  7. linux我ll查不到usr,Linux学习-文件查寻
  8. 工业4.0的小小思考
  9. Matlab变量、分支语句和循环语句
  10. 【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 1.程序分析:(ab)?a:b这是条件运算符的基本例子。...