传送门

设\(f[i]\)为以\(i\)结尾的最长上升子序列。可以考虑建这样一张图,对于所有的\(i<j,f[j]=f[i+1]\)连边\((i,j)\),\(f[i]=1\)的话连边\((S,i)\),\(f[i]=max(f[j])\)的话连边\((j,T)\),然后就是删去若干个点使\(S,T\)不连通并且代价最小,那么拆点最小割就行了

然后是字典序的问题。我们把所有的点按\(c\)排个序然后看看这个点也就是新图中的这条边是否可以在最小割里。只要判断一下残量网络中是否存在\(u\)到\(u+n\)的路径就是了

然后删去这条边之后要重新算最大流,如果直接计算会T,这样的话我们可以退流,就是从\(T\)到\(u+n\)跑一次最大流再从\(u\)到\(S\)跑一次最大流就可以消除这条边的影响

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1e4+5,M=1e6+5;
struct eg{int v,nx,w;}e[M];int head[N],tot=1;
inline void add(R int u,R int v,R int w){
e[++tot]={v,head[u],w},head[u]=tot;
e[++tot]={u,head[v],0},head[v]=tot;
}
struct node{
int c,id;
inline bool operator <(const node &b)const{return c<b.c;}
}c[N];
int dep[N],q[N],a[N],b[N],f[N],st[N];
int n,m,mx,S,T,h,t,top,flow;
bool bfs(int S,int T){
fp(i,0,(n<<1|1))dep[i]=-1;q[h=t=1]=S,dep[S]=0;
while(h<=t){
int u=q[h++];go(u)if(dep[v]<0&&e[i].w){
dep[v]=dep[u]+1,q[++t]=v;
if(v==T)return true;
}
}return false;
}
int dfs(int u,int T,int lim){
if(u==T||!lim)return lim;int flow=0,f;
go(u)if(dep[v]==dep[u]+1&&(f=dfs(v,T,min(lim,e[i].w)))){
flow+=f,lim-=f,e[i].w-=f,e[i^1].w+=f;
if(!lim)break;
}if(!flow)dep[u]=-1;return flow;
}
inline int dinic(int S,int T){int flow=0;while(bfs(S,T))flow+=dfs(S,T,inf);return flow;}
inline void cl(){memset(head,0,sizeof(head)),mx=0,tot=1;}
void solve(){
cl(),n=read();
fp(i,1,n)a[i]=read();
fp(i,1,n)b[i]=read();
fp(i,1,n)c[i].c=read(),c[i].id=i;
fp(i,1,n){
f[i]=1;
fp(j,1,i-1)if(a[j]<a[i])cmax(f[i],f[j]+1);
cmax(mx,f[i]);
}S=0,T=n<<1|1,top=0;
fp(i,1,n)add(i,i+n,b[i]);
fp(i,1,n)if(f[i]==1)add(S,i,inf);
fp(i,1,n)if(f[i]==mx)add(i+n,T,inf);
fp(i,1,n)fp(j,1,i-1)if(a[j]<a[i]&&f[i]==f[j]+1)add(j+n,i,inf);
flow=dinic(S,T);sort(c+1,c+1+n);
fp(i,1,n){
int u=c[i].id;if(bfs(u,u+n))continue;
dinic(T,u+n),dinic(u,S),st[++top]=u;
}sort(st+1,st+1+top);printf("%d %d\n",flow,top);
fp(i,1,top)printf("%d%c",st[i]," \n"[i==top]);
}
int main(){
// freopen("testdata.in","r",stdin);
int cas=read();
while(cas--)solve();
return 0;
}

P3308 [SDOI2014]LIS(最小割+退流)的更多相关文章

  1. 【BZOJ-3532】Lis 最小割 + 退流

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

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

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

  3. BZOJ3532 [Sdoi2014]Lis 【网络流退流】

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

  4. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  5. 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1685  Solved: 724[Submit] ...

  6. BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...

  7. hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)

    /** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...

  8. BZOJ1001:狼抓兔子(最小割最大流+vector模板)

    1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...

  9. HDU1565 方格取数(1) —— 状压DP or 插头DP(轮廓线更新) or 二分图点带权最大独立集(最小割最大流)

    题目链接:https://vjudge.net/problem/HDU-1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory L ...

随机推荐

  1. 如何评价ionic和react native?

    Q:对于开发hybird app首选哪个好?是ionic还是react native?如何评价ionic和react native? A: 我看好React系,React系以正确地姿势,专注地做了正确 ...

  2. .NET Core windows开发环境 + Git代码控管 + Docker 部署环境搭建

    开发环境准备 下载vs code,.NET Core sdk: https://www.microsoft.com/net/core#windowscmd 目前最新版为code 1.8.1,.NET ...

  3. ZOJ 1232 【灵活运用FLOYD】 【图DP】

    题意: copy自http://blog.csdn.net/monkey_little/article/details/6637805 有A个村子和B个城堡,村子标号是1~A,城堡标号是A+1~B.马 ...

  4. 2017年icpc西安网络赛 Maximum Flow (找规律+数位dp)

    题目 https://nanti.jisuanke.com/t/17118 题意 有n个点0,1,2...n-1,对于一个点对(i,j)满足i<j,那么连一条边,边权为i xor j,求0到n- ...

  5. java开发面试大全刷题整理

    题目源自Java团长公众号,内容个人整理,来源于各大博客,未经允许,不准摘抄,仅供分享,不做商业使用. 本分享多数为浅层知识体系,更为底层的还请自行多写写代码,若有不对之处,望广大的人才指点,不喜勿喷 ...

  6. MySQL事务及Spring事务管理

    事务,是在数据库中用于保证数据正确性的一种机制,涉及到很多概念以及不同的情况,这里做一个总结 相关概念 事务四特性(ACID) 原子性(Atomicity,或称不可分割性):要么全部完成或者全部不完成 ...

  7. why在重写equals时还必须重写hashcode方法

    首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...

  8. weblogic线程阻塞性能调优(图解)

    转自:http://blog.csdn.net/z69183787/article/details/12647539 声明:出现这个问题有程序方面.网络方面.weblogic设置方面等等原因,此文章主 ...

  9. win7电脑定时开机设置方法

    在BIOS设置主界面中选择“Power Management Setup”,进入“电源管理”窗口. 注:缺省情况下,“Resume By Alarm”定时开机选项是关闭的. 将鼠标移到“Resume ...

  10. 表皮囊肿?wtf

    https://baike.baidu.com/item/%E8%A1%A8%E7%9A%AE%E5%9B%8A%E8%82%BF/7852024?fr=aladdin