BZOJ 3532: [Sdoi2014]Lis (最大流)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3532
题意:给出三个数列ABC,长度均为n。删除A中的某些数字,使得A的最长上升子列至少减少1。删掉的数字的代价为相应的B值之和。要求使得代价最小。多组答案时,使得删掉的数字的C值排序的字典序最小。
思路:假设不考虑字典序。那么只要拆点求最小割即可。设f[i]表示到i的最长上升子列。对于两个数字(i,j),若A[i]<A[j]且f[i]+1=f[j],则i向j连边。对于每个点拆开的点连边为B值。
现在要求字典序最小,首先按照C排序,然后从小到大枚举。对于数字x判断其是否在最小割中。若其代表的边(x1,x2)之间的流量为0,且在残留网络中x1不能到达x2,那么x在最小割中。之后还要去掉x这条边。只需要将这条边以及反向边的流量设为0,同时跑(T,x2)(x1,S)的最大流即可,这样可以恢复x原来的边带来的影响。
const int INF=2000000005;
const int N=1444;
struct node
{
int v,next;
int cap;
};
node edges[1100000];
int head[N],e;
int curedge[N];
inline void add(int u,int v,int cap)
{
edges[e].v=v;
edges[e].cap=cap;
edges[e].next=head[u];
head[u]=e++;
}
inline void Add(int u,int v,i64 cap)
{
add(u,v,cap);
add(v,u,0);
}
int S,T;
int dis[N];
int Q[N];
int bfs(int s,int t)
{
clr(dis,-1);
int i;
for(i=S;i<=T;i++) curedge[i]=head[i];
int L=0,R=0;
dis[t]=0;
Q[R++]=t;
while(L<R)
{
int u=Q[L++];
for(i=head[u];i!=-1;i=edges[i].next)
{
if(edges[i^1].cap&&-1==dis[edges[i].v])
{
dis[edges[i].v]=dis[u]+1;
Q[R++]=edges[i].v;
if(edges[i].v==s) return 1;
}
}
}
return 0;
}
int DFS(int u,int det,int t)
{
if(u==t) return det;
int now=0;
int i;
for(int &i=curedge[u];i!=-1&&det;i=edges[i].next)
{
int v=edges[i].v;
int w=edges[i].cap;
if(w&&dis[u]==dis[v]+1)
{
int tmp=DFS(v,min(w,det),t);
if(tmp==0) continue;
edges[i].cap-=tmp;
edges[i^1].cap+=tmp;
now+=tmp;
det-=tmp;
}
}
return now;
}
int dinic(int s,int t)
{
int ans=0;
while(bfs(s,t)) ans+=DFS(s,INF,t);
return ans;
}
pair<int,int> C[777];
int A[777],B[777];
int n;
int f[777];
int num[777];
int main()
{
int cse=getInt();
while(cse--)
{
n=getInt();
int i;
for(i=1;i<=n;i++) A[i]=getInt();
for(i=1;i<=n;i++) B[i]=getInt();
for(i=1;i<=n;i++) C[i].first=getInt(),C[i].second=i;
int j;
int Max=1;
for(i=1;i<=n;i++)
{
f[i]=1;
for(j=1;j<i;j++) if(A[j]<A[i]) f[i]=max(f[i],f[j]+1);
Max=max(Max,f[i]);
}
clr(head,-1); e=0;
S=0,T=n+n+1;
for(i=1;i<=n;i++)
{
num[i]=e;
Add(i*2-1,i*2,B[i]);
if(f[i]==1) Add(S,i*2-1,INF);
if(f[i]==Max) Add(i*2,T,INF);
for(j=i+1;j<=n;j++) if(A[i]<A[j]&&f[i]+1==f[j]) Add(i*2,j*2-1,INF);
}
int ans=dinic(S,T);
sort(C+1,C+n+1);
int a[777],aNum=0;
for(i=1;i<=n;i++)
{
int t=C[i].second;
int k=num[t];
if(edges[k].cap!=0) continue;
if(bfs(t*2-1,t*2)) continue;
dinic(T,t*2);
dinic(t*2-1,S);
edges[k^1].cap=0;
a[++aNum]=C[i].second;
}
sort(a+1,a+aNum+1);
printf("%d %d\n",ans,aNum);
for(i=1;i<=aNum;i++)
{
if(i>1) putchar(' ');
printf("%d",a[i]);
}
puts("");
}
}
BZOJ 3532: [Sdoi2014]Lis (最大流)的更多相关文章
- BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)
BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...
- [BZOJ]3532: [Sdoi2014]Lis
Time Limit: 10 Sec Memory Limit: 512 MB Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序 ...
- 3532: [Sdoi2014]Lis 最小字典序最小割
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 865 Solved: 311[Submit][Status] ...
- 3532: [Sdoi2014]Lis
Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去 ...
- bzoj千题计划141:bzoj3532: [Sdoi2014]Lis
http://www.lydsy.com/JudgeOnline/problem.php?id=3532 如果没有字典序的限制,那么DP拆点最小割即可 加上字典序的限制: 按c从小到大枚举最小割边集中 ...
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- [bzoj3532][Sdoi2014]Lis——拆点最小割+字典序+退流
题目大意 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性 ...
- BZOJ3532 [Sdoi2014]Lis 【网络流退流】
题目 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性排序 ...
- Lis(bzoj 3532)
Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出 ...
随机推荐
- Javascript中的json操作
<!doctype html> <html> <head> <title>extjs-json</title> <script typ ...
- [php] PHPStorm8 for Yincart project
PHPStorm8 license for Yincart project: https://github.com/yinheark/yincart2 User Name: Yincart ===== ...
- 开源软件free download manager在windows defender中报毒
从官网上下载的fdm lite 3.9.6,从图片中可以看出安装包有数字签名,windows defender报毒,在线杀毒也检出木马,官网的程序更新到了3.9.6版本,在sourceforge上的源 ...
- 介绍“Razor”— ASP.NET的一个新视图引擎
我的团队当前正在从事的工作之一就是为ASP.NET添加一个新的视图引擎. 一直以来,ASP.NET MVC都支持 “视图引擎”的概念—采用不同语法的模板的可插拔模块.当前ASP.NET MVC “默认 ...
- CGRectGet系列
CGRectGetHeight返回label本身的高度 CGRectGetMinY返回label顶部的坐标 CGRectGetMaxY 返回label底部的坐标 CGRectGetMinX 返回lab ...
- 微信公众平台自定义菜单PHP开发
微信公众平台自定义菜单PHP开发,微信公众平台自定义菜单是如何实现的呢?其实很简单,首先在微信公众平台升级为服务号,获取appid和appsecret,然后根据这2个参数获取access_token, ...
- Android中的图片压缩
1.android中计算图片占用堆内存的kB大小跟图片本身的kB大小无关,而是根据图片的尺寸来计算的. 比如一张 480*320大小的图片占用的堆内存大小为: 480*320*4/1024=600kB ...
- 将ASCII码位于32~126的95个字符输出到屏幕上,为了美观
//将ASCII码位于32~126的95个字符输出到屏幕上,为了美观.要求小于100的码,前面加一个0,每八个转行class shijixing{ public static void main(St ...
- 第十一章 Android 内核驱动——Alarm
11.1 基本原理 Alarm 闹钟是 android 系统中在标准 RTC 驱动上开发的一个新的驱动,提供了一个定时器 用于把设备从睡眠状态唤醒,当然因为它是依赖 RTC 驱动的,所以它同时还可以 ...
- YTU 2295: KMP模式匹配 一(串)
2295: KMP模式匹配 一(串) 时间限制: 1 Sec 内存限制: 128 MB 提交: 32 解决: 22 题目描述 求子串的next值,用next数组存放,全部输出 输入 输入一个字符串 ...