P3308 [SDOI2014]LIS(最小割+退流)
设\(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(最小割+退流)的更多相关文章
- 【BZOJ-3532】Lis 最小割 + 退流
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 704 Solved: 264[Submit][Status] ...
- BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)
BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...
- BZOJ3532 [Sdoi2014]Lis 【网络流退流】
题目 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性排序 ...
- hdu4289 最小割最大流 (拆点最大流)
最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...
- 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点
1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1685 Solved: 724[Submit] ...
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
- HDU1565 方格取数(1) —— 状压DP or 插头DP(轮廓线更新) or 二分图点带权最大独立集(最小割最大流)
题目链接:https://vjudge.net/problem/HDU-1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory L ...
随机推荐
- Codeforces 653C Bear and Up-Down【暴力】
题目链接: http://codeforces.com/problemset/problem/653/C 题意: 给定序列,偶数位的数字比两边都大,则成为nice,只可以交换两个数字,问有多少种交换方 ...
- powerDigner使用
PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...
- hdoj 1533 Going Home 【最小费用最大流】【KM入门题】
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- VS自己定义project向导开发(Custom Wizard)
在vs2010中定制VC++project向导有例如以下两种方式: 改动现有向导.以满足自己的须要: 使用"自己定义向导"来产生一个向导骨架,并设计自己的向导. 本文档仅仅讨 ...
- Android常见UI组件之ListView(二)——定制ListView
Android常见UI组件之ListView(二)--定制ListView 这一篇接上篇.展示ListView中选择多个项及实现筛选功能~ 1.在位于res/values目录下的strings.xml ...
- RAM、ROM和磁盘
计算机存储数据的存储器主要分为RAM(随机訪问存储器).ROM.磁盘. RAM又分为SRAM和DRAM两种,SRAM用作快速缓存,DRAM用作主存. 1.SRAM SRAM又被称为静态RAM.利 ...
- APUE 线程 - 程序清单
APUE 线程 - 程序清单 程序清单11-1 打印线程ID #include "util.h" #include<pthread.h> pthread_t ntid; ...
- 全局最小割模版 n^3
//点标从0-n-1, 開始时先init 复杂度n^3 //对于边(u,v,flow): //g[u][v]+=flow; //g[v][u]+=flow; typedef long long ll; ...
- 使用spring框架时,使用xml还是注解
1 xml的优缺点 1.1 优点 解耦合,方便维护.xml不入侵代码,方便代码阅读. 1.2 缺点 开发速度慢. 2 注解的优缺点 2.1 优点 能够加快开发速度,因为它将常用的主体逻辑隐藏在注解中了 ...
- UPDATE command denied DELETE
可用磁盘空间不足 支持SELECT information_schema. TABLES