很好的一道题,对理解最小割有很大帮助

首先,不难发现本题与网络流24题中的某一道很类似,我们可以先跑一次dp求出每个节点的LIS,然后拆点,拆出的两点之间连流量为删除的代价的边,剩下的点之间按dp的转移连流量正无穷的边,最后跑最小割即为第一问答案

但是第二问有个问题:又引入了一个量要求最小割字典序最小,这怎么办?

首先我们考虑:字典序最小的话我们就要让第一个尽可能小,然后让第二个尽可能小...以此类推

那么我们考虑什么样的边可能在最小割中

这样的边一定满足如下条件:

第一.这条边已经满流了

第二.这条边的两端之间不存在增广路

如果一条边满足这样的条件,那么这条边就可以在一个最小割之中

那么我们把点按第三个变量排序,从小到大判断能否加入最小割,如果能加入最小割的话则需要退流,也就是退掉源点和汇点到这条边两端的流,这一步可以反向dfs解决

于是这题就结束了

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int inf=0x3f3f3f3f;
struct Edge
{
int nxt;
int to;
int val;
int flo;
}edge[500005];
struct Info
{
int num,v,w,c;
friend bool operator < (Info a,Info b)
{
return a.c<b.c;
}
}f[1005];
int re[1005];
int head[5005];
int cur[5005];
int dis[5005];
int toe[5005];
int dp[1005];
int cnt=1,ttop=0;
int T,n;
int st,ed;
void init()
{
memset(head,0,sizeof(head));
memset(dp,0,sizeof(dp));
cnt=1,ttop=0;
}
void add(int l,int r,int w)
{
edge[cnt].nxt=head[l];
edge[cnt].to=r;
edge[cnt].val=w;
head[l]=cnt++;
}
void dadd(int l,int r,int w)
{
add(l,r,w),add(r,l,0);
}
int ide(int x)
{
return x&1?x+1:x-1;
}
bool bfs(int fr,int Ed)
{
memcpy(cur,head,sizeof(head));
memset(dis,0,sizeof(dis));
dis[fr]=1;
queue <int> M;
M.push(fr);
while(!M.empty())
{
int u=M.front();
M.pop();
for(int i=head[u];i;i=edge[i].nxt)
{
int to=edge[i].to;
if(edge[i].val>edge[i].flo&&!dis[to])
{
dis[to]=dis[u]+1,M.push(to);
if(to==Ed)return 1;
}
}
}
return dis[Ed];
}
int dfs(int x,int lim,int Ed)
{
if(x==Ed||!lim)return lim;
int ret=0;
for(int i=cur[x];i;i=edge[i].nxt)
{
cur[x]=i;
int to=edge[i].to;
if(dis[to]==dis[x]+1&&edge[i].val>edge[i].flo)
{
int temp=dfs(to,min(lim,edge[i].val-edge[i].flo),Ed);
if(temp)
{
ret+=temp,lim-=temp;
edge[i].flo+=temp,edge[ide(i)].flo-=temp;
if(!lim)break;
}
}
}
return ret;
}
int dinic()
{
int ans=0;
while(bfs(st,ed))ans+=dfs(st,inf,ed);
return ans;
}
inline int read()
{
int f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
T=read();
while(T--)
{
init();
n=read();
st=2*n+1,ed=2*n+2;
for(int i=1;i<=n;i++)f[i].num=i,f[i].v=read(),dp[i]=1;
for(int i=1;i<=n;i++)f[i].w=read(),dadd((i<<1)-1,i<<1,f[i].w),toe[i]=cnt-1;
for(int i=1;i<=n;i++)for(int j=1;j<i;j++)if(f[i].v>f[j].v)dp[i]=max(dp[i],dp[j]+1);
int maxx=0;
for(int i=1;i<=n;i++)maxx=max(maxx,dp[i]);
for(int i=1;i<=n;i++)
{
if(dp[i]==1)dadd(st,(i<<1)-1,inf);
else if(dp[i]==maxx)dadd(i<<1,ed,inf);
for(int j=1;j<i;j++)if(f[i].v>f[j].v&&dp[j]+1==dp[i])dadd(j<<1,(i<<1)-1,inf);
}
for(int i=1;i<=n;i++)f[i].c=read();
printf("%d ",dinic());
sort(f+1,f+n+1);
for(int i=1;i<=n;i++)
{
int k=f[i].num;
if(bfs((k<<1)-1,k<<1))continue;
re[++ttop]=k;
while(bfs(ed,(k<<1)))dfs(ed,inf,(k<<1));
while(bfs((k<<1)-1,st))dfs((k<<1)-1,inf,st);
edge[toe[k]].val=edge[ide(toe[k])].val=0;
edge[toe[k]].flo=edge[ide(toe[k])].flo=0;
}
printf("%d\n",ttop);
sort(re+1,re+ttop+1);
for(int i=1;i<=ttop;i++)printf("%d ",re[i]);
printf("\n");
}
return 0;
}

bzoj 3532的更多相关文章

  1. BZOJ 3532: [Sdoi2014]Lis (最大流)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3532 题意:给出三个数列ABC,长度均为n.删除A中的某些数字,使得A的最长上升子 ...

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

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

  3. [BZOJ]3532: [Sdoi2014]Lis

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

  4. Lis(bzoj 3532)

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

  5. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  6. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  7. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  8. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  9. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  10. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

随机推荐

  1. 服务器consul与本地服务健康检查不通问题解决

    (125条消息) 服务器consul与本地服务健康检查不通问题解决_向往鸟的博客-CSDN博客_consul健康检查失败 .MathJax, .MathJax_Message, .MathJax_Pr ...

  2. Python的入门学习之Day 9——from“夜曲编程”

    Day 9 time: 2021.8.6. 昨天复习了第一章"数据与运算".第二章"条件判断"的相关重点,今天就感觉得心应手了.今天上新的内容是关于新一章节&q ...

  3. mysql 优化表空间报错Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again

    背景:mysql数据库中有几个表的碎片率太高,浪费了存储空间且降低了读写效率,需要整理. mysql版本:5.6 先用optimize table 试试. 也执行了很久.但是结束后,data_free ...

  4. 51电子-STC89C51开发板:程序烧录(刷写) 到 IC 设置

    全部内容,请点击: 51电子-STC89C51开发板:<目录> ---------------------------  正文开始  --------------------------- ...

  5. 无锡哲讯谈饲料加工行业ERP的功能

    我国饲料生产与国际先进水平很接近,也是专业化水平较高的行业.随着社会分工的进一步明确,饲料产品的专业化配送将是未来发展的方向.在一些发达国家,专业化的散装配料车已经普遍应用,我国虽然也有这种形式,但是 ...

  6. 调度器46—tick模式

    一.tick简介 tick就是一个周期性的中断,周期通过 CONFIG_HZ 进行配置,一般常取值为100Hz.250Hz.1000Hz.Tick 每秒窃取CPU 100 到 1000 次,导致Ica ...

  7. Salesforce 发送Email时遇到的问题(Case当中的Filed不出现Email选项:ケースのフィールドにメールタブが表示されない)。

    普段はケースの発生源はメールと選択する場合.ディフォルトで「フィールド」の中に「メール」というタブが出てきますが. (平时当我们选择[Case]的[来源]为[Email]时,默认就会在field中出现 ...

  8. CRC校验模板

    #ifndef CRC_H #define CRC_H #include "main.h" #ifdef CRC_C #endif typedef struct { uchar R ...

  9. String类对象的常用操作及方法

    在Java中,String类包含有50多个方法来实现字符串的各种操作,以下介绍一些我们需要经常使用的方法.1.字符串的连接public String concat(String str) 该方法的参数 ...

  10. 使用python做基本的数据处理

    使用python做基本的数据处理 1.常用的基本数据结构 元组.列表.字典.集合.常用的序列函数 1.1基本操作 1.1.1 元组:逗号分开的序列值. tup = tuple (4,5,6) tup ...