题目链接: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 (最大流)的更多相关文章

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

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

  2. [BZOJ]3532: [Sdoi2014]Lis

    Time Limit: 10 Sec  Memory Limit: 512 MB Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序 ...

  3. 3532: [Sdoi2014]Lis 最小字典序最小割

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

  4. 3532: [Sdoi2014]Lis

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

  5. bzoj千题计划141:bzoj3532: [Sdoi2014]Lis

    http://www.lydsy.com/JudgeOnline/problem.php?id=3532 如果没有字典序的限制,那么DP拆点最小割即可 加上字典序的限制: 按c从小到大枚举最小割边集中 ...

  6. [bzoj 1449] 球队收益(费用流)

    [bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...

  7. [bzoj3532][Sdoi2014]Lis——拆点最小割+字典序+退流

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

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

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

  9. Lis(bzoj 3532)

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

随机推荐

  1. LIKE 某个变量

    declare i ); n number; begin i:='%D0FC02EAR11005%'; select po_header_id into n from po_headers_all w ...

  2. fault coverage enhancement

    在pseudo-random test中,由于random pattern resistant的特性,fault coverage不是sufficient的, 所以会有一些办法来进行coverage的 ...

  3. 【Winfrom】简单的焦点设置问题

    原文: http://blog.csdn.net/zlwzlwzlw/article/details/8573921 初始的时候希望指定控件的焦点 不能用load事件 要用Activated事件才行 ...

  4. fedora环境安装webkit支持作爬虫下载解析JS

    环境: 我使用的fedora19.1-xfce版本,属于redhat系的桌面环境. 1.安装 webkit源码安装webkit失败,这里提供的是yum安装方式. a.查看当前yum库中的webkit资 ...

  5. Oracle的导入导出

    写批处理文件的基础知识 http://blog.chinaunix.net/uid-20672257-id-3056546.html http://wenku.baidu.com/view/db9c5 ...

  6. Linux内核配置机制(make menuconfig 、Kconfig、Makefile)讲解【转】

    本文转载自:http://www.codexiu.cn/linux/blog/34801/ 前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式—— ...

  7. 启用WCF测试客户端的相关技巧

    在Visual Studio之外打开WCF测试客户端有两种方法:第一种方法是到其所在路径(Visual Studio安装路径\Common7\IDE\WcfTestClient.exe)双击打开.第二 ...

  8. sort DEMO

    测试用文件: [weblogic@etp-mall-dev7][/tmp]$ cat msn.txt aaa, fff, bbb, cc, ee, gg, hh, zz, mmm, DEMO1:按第一 ...

  9. 输入框焦点时自动清除value

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <script typ ...

  10. MySQL连接字符串总结

    一.MySQL Connector/ODBC 2.50 (MyODBC 2.50)连接方式 1.本地数据库连接 Driver={MySQL};Server=localhost;Option=16834 ...