Lis(bzoj 3532)
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
6
3 4 4 2 2 3
2 1 1 1 1 2
6 5 4 3 2 1
Sample Output
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)相关推荐
- 分裂游戏(bzoj 1188)
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- ZOJ 4028 15th浙江省省赛E. LIS(神奇贪心)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4028 题意: 有一个长度为n的序列A,你不知道这个序列的中每个元 ...
- 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子
有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...
- 飞镖(bzoj 2335)
Description 飞镖是在欧洲颇为流行的一项运动.它的镖盘上分为20个扇形区域,分别标有1到20的分值,每个区域中有单倍.双倍和三倍的区域,打中对应的区域会得到分值乘以倍数所对应的分数.例如打中 ...
- OSU!(bzoj 4318)
Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...
- 亚瑟王(bzoj 4008)
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
- GT考试(bzoj 1009)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...
- 切糕(bzoj 3144)
Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...
- 文本生成器(bzoj 1030)
Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...
最新文章
- 微软创立全新人工智能实验室,与DeepMind、OpenAI同台竞技
- 评估微型计算机的主要指标,微型计算机的工作过程和主要性能指标.doc
- HTTP-post请求重定向后变成了GET请求
- 内存缓存MemoryCache
- c#web页面显示弹窗_基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用
- Cheatsheet: 2015 03.01 ~ 03.31
- MNIST机器学习入门
- matlab gpu 编程 macOS,MATLAB GPU编程基础
- ubuntu安装过程中遇到的一些问题及解决办法。
- 光纤非线性效应对光OFDM信号的影响研究
- 论模式在领域驱动设计中的重要性
- datagrid.columns有没有图片图片属性_天龙八部:86四属性神器在线求超越,原来逍遥扇子还能这么洗...
- 计算机鼠标双击怎么,电脑鼠标双击变成属性的解决方法
- java wsimport 调用_java使用wsimport调用wcf接口
- php8新特性全览【超详细】
- 解决cannot find grldr in all devices问题
- 电脑常用快捷键的使用
- Ubuntu防火墙ufw规则配置
- lmproperly specified vM option.To fix the proble Android studio JVM启动错误
- 解决VMware Workstation 与 Hyper-V 不兼容。请先从系统中移除 Hyper-V 角色,然后再运行 VMware Workstation。
热门文章
- iOS 应用安全权威指南电子书 PDF 分享
- 解决 LLVM 错误提示 may only occur zero or one times!
- CentOS生成自签名证书配置Apache https
- linux操作系统adsl 上网设置,Linux操作系统下ADSL拨号上网详细步骤
- TCP中的RTT和RTO
- 关于ViewTreeObserver的理解
- linux我ll查不到usr,Linux学习-文件查寻
- 工业4.0的小小思考
- Matlab变量、分支语句和循环语句
- 【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 1.程序分析:(ab)?a:b这是条件运算符的基本例子。...