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 ...
随机推荐
- django学习之- Ajax
提示:jquery要使用1版本,因为高版本已不兼容低版本的游览器.参考url:http://www.cnblogs.com/wupeiqi/articles/5703697.html原生ajax:Aj ...
- 破解电信光猫华为HG8120C关闭路由功能方法
昨天电信的工作人员来安装了电信的光纤宽带,使用的是华为HG8120C这款光电转换器与路由器一体机 这导致下级路由无法直接使用PPPOE拨号连接到互联网,且无法使用端口映射来实现外网访问 而华为开放给用 ...
- Guice 学习(八)AOP (面向切面的编程)
Guice的AOP还是非常弱的.眼下只支持方法级别上的,另外灵活性也不是非常高. 看例如以下演示样例: Guice支持AOP的条件是: 类必须是public或者package (default) 类不 ...
- InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts
在一台server中以各数据库的备份文件为数据文件启动多个MySQL实例供SQL Review使用. 之前执行一直没有问题(最多的时候有23个MySQL实例同一时候执行).后来新配置了一台server ...
- JMeter 系列之—-01使用
用Jmeter 做压测,总体与LoadRunner 类似: 一.线程组 1. 线程数 2. 循环次数 单个线程循环次数 3. Ramp-up Period(in seconds) [1]决定多长时间启 ...
- I2C上拉电阻取值范围
I2C总线是微电子通信控制领域中常用的一种总线标准,具备接线少,控制简单,速率高等优点.在I2C电路中常见的上拉电阻有1k.1.5k.2.2k.4.7k.5.1k.10k等等,但是应该如何根据开发要求 ...
- 解决Struts配置文件里无提示信息的问题
(1)在struts2配置文件编写的时候.有可能无法提示所有信息,在配置文件里打个"<" 后,并没有不论什么的提示信息(使用快捷键Alt+/ 也不提示) 原因是下边的 &q ...
- 图像处理之基础---很好的一个快速比较两副图片是否相同的code 可用于公安鉴别
转自Codeproject http://www.codeproject.com/dotnet/comparingimages.asp Public Enum CompareResult ciComp ...
- 【内存数据库】OracleTimesten连接DSN创建用户
************************************************************************ ****原文:blog.csdn.net/clark_ ...
- Xcode 中的小技巧
显示或隐藏欢迎页面 Command + Shift + 1 显示欢迎页 假设不想每次打开都显示,能够将上图中的勾去掉