3532: [Sdoi2014]Lis 最小字典序最小割
3532: [Sdoi2014]Lis
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 865 Solved: 311
[Submit][Status][Discuss]
Description
给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci。请删除若
干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案。
如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种。
这题难点在如何求一组最小字典序最小的最小割。
一条边是一种割集中的一条边当且仅当它在任何最大流方案中都是满流。
即它当前满流且从这条边的出点到入点找不到增广路。
当确定一条边必须在边集中后,从出点向S增广,从T向入点增广,再把容量清零,相当于把这条边删掉。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define N 1405
#define M 1000005
using namespace std;
vector<int>ss;
int head[N],ver[M],nxt[M],f[M],tot;
void add(int a,int b,int c)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;f[tot]=c;
tot++;nxt[tot]=head[b];head[b]=tot;ver[tot]=a;f[tot]=0;return ;
}
queue<int>q;int ch[N];
int S,T;
bool tell()
{
memset(ch,-1,sizeof(ch));
q.push(S);ch[S]=0;
while(!q.empty())
{
int tmp=q.front();q.pop();
for(int i=head[tmp];i;i=nxt[i])
{
if(f[i]&&ch[ver[i]]==-1)
{
ch[ver[i]]=ch[tmp]+1;
q.push(ver[i]);
}
}
}
return ch[T]!=-1;
}
ll zeng(int a,int b)
{
if(a==T)return b;
int r=0;
for(int i=head[a];i!=0&&b>r;i=nxt[i])
{
if(f[i]&&ch[ver[i]]==ch[a]+1)
{
int t=zeng(ver[i],min(f[i],b-r));
f[i]-=t;f[i^1]+=t;r+=t;
}
}
if(!r)ch[a]=-1;
return r;
}
ll dinic()
{
ll r=0,t;
while(tell())
{
while(t=zeng(S,inf))
{
r+=t;
}
}
return r;
}
int n,a[N],b[N],c[N];
int p[N],dp[N];
bool cmp(int x,int y)
{
return c[x]<c[y];
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
memset(head,0,sizeof(head));
memset(dp,0,sizeof(dp));
ss.clear();
scanf("%d",&n);tot=1;// i i*2 i*2+1
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
for(int i=1;i<=n;i++)scanf("%d",&c[i]),add(i,i+n,b[i]);
for(int i=1;i<=n;i++)p[i]=i;
sort(p+1,p+n+1,cmp);int mx=0;
for(int i=1;i<=n;i++)
{
dp[i]=1;
for(int j=1;j<i;j++)
{
if(a[i]>a[j])dp[i]=max(dp[i],dp[j]+1);
}
mx=max(mx,dp[i]);
}
S=0;T=2*n+1;
for(int i=1;i<=n;i++)if(dp[i]==mx)add(i+n,T,inf);
for(int i=1;i<=n;i++)if(dp[i]==1)add(S,i,inf);
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(a[i]>a[j]&&dp[i]==dp[j]+1)
{
add(j+n,i,inf);
}
}
}
ll ans1=dinic();
for(int i=1;i<=n;i++)
{
int x=p[i];
S=x;T=x+n;
if(f[x*2]||tell())continue;
S=x;T=0;dinic();
S=2*n+1;T=x+n;dinic();
ss.push_back(x);
f[x*2]=f[x*2+1]=0;
}
sort(ss.begin(),ss.end());
printf("%lld %d\n",ans1,ss.size());
for(int i=0;i<ss.size();i++)
{
printf("%d%c",ss[i]," \n"[i==ss.size()-1]);
}
}
return 0;
}
3532: [Sdoi2014]Lis 最小字典序最小割的更多相关文章
- 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,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性 ...
- BZOJ 3532: [Sdoi2014]Lis (最大流)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3532 题意:给出三个数列ABC,长度均为n.删除A中的某些数字,使得A的最长上升子 ...
- [BZOJ]3532: [Sdoi2014]Lis
Time Limit: 10 Sec Memory Limit: 512 MB Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序 ...
- 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从小到大枚举最小割边集中 ...
- POJ1815 Friendship(字典序最小最小割割边集)
看了题解.当时也觉得用邻接矩阵挺好写的,直接memset:然而邻接矩阵不懂得改,于是就放开那个模板,写了Dinic.. 方法是,按字典序枚举每一条满流的边,然后令其容量减1,如果最大流改变了,这条边就 ...
- poj 1815 Friendship 字典序最小+最小割
题目链接:http://poj.org/problem?id=1815 In modern society, each person has his own friends. Since all th ...
- BZOJ1046 [HAOI2007]上升序列 【LIS + 字典序最小】
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5410 Solved: 1877 [Submit][St ...
随机推荐
- Git----02本地仓库进行文件添加&修改&删除&查看
一.将新文件上传到本地仓库----使用小乌龟工具 1.1.将文件添加到暂存区 进入仓库目录,创建文件,添加暂存区 1.2.将文件添加到本地仓库 选中已经添加到暂存区的文件,进行提交 二.查看本 ...
- css 剩余宽度完全填充
从网上转的. <html> <head> <meta http-equiv="Content-Type" content="text/htm ...
- maven实战读书笔记(二)
一个Spring加载属性的工具类,指定目标位置之后可以用${}的方式加载配置文件 测试maven工程发送email的例子:运行成功的例子—github 常用的命令: mvn clean compile ...
- Bag类课后作业
20162316 Bag课后作业 下面小标题都是码云链接 实现代码 import java.util.Arrays; public class Bag implements BagInterface ...
- Calculator项目的过程及感受
1.将Calculator项目传到Github上的链接地址:https://github.com/sonnypp/object-oriented/tree/master/Calculator 2.本次 ...
- Leetcode题库——31.下一个排列
@author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...
- Codeforces Round #304 (Div. 2) E. Soldier and Traveling 最大流
题目链接: http://codeforces.com/problemset/problem/546/E E. Soldier and Traveling time limit per test1 s ...
- Unity3D游戏开发——访问集中式共享模块的设计模式
什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.设计模式是开发人员在开发过程中面临的一般问题的解决方案,这些解决方案是众多开发人 ...
- Ubuntu下tensorboard的使用
1. 找到运行程序的事件输出路径 找到路径并进入,例如我的是在路径/home/ly/codes下: 2. 打开tensorboard服务器 在终端输入(--logdir=自己所存的路径): t ...
- ADT队列/FIFO表
队列是一种特殊的表,只在表首进行删除,只在表尾进行插入,按照先进先出原则操作(First In First Out),又称为FIFO表: 队列的指针实现代码: #include<cstdio&g ...