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 最小字典序最小割的更多相关文章

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

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

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

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

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

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

  4. [BZOJ]3532: [Sdoi2014]Lis

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

  5. 3532: [Sdoi2014]Lis

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

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

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

  7. POJ1815 Friendship(字典序最小最小割割边集)

    看了题解.当时也觉得用邻接矩阵挺好写的,直接memset:然而邻接矩阵不懂得改,于是就放开那个模板,写了Dinic.. 方法是,按字典序枚举每一条满流的边,然后令其容量减1,如果最大流改变了,这条边就 ...

  8. poj 1815 Friendship 字典序最小+最小割

    题目链接:http://poj.org/problem?id=1815 In modern society, each person has his own friends. Since all th ...

  9. BZOJ1046 [HAOI2007]上升序列 【LIS + 字典序最小】

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5410  Solved: 1877 [Submit][St ...

随机推荐

  1. sqli-labs学习笔记 DAY5

    DAY 5 sqli-labs lesson 26a 闭合符号为单引号和括号,并且不回显错误,如果服务器是Linux,尝试%a0代替空格,这里尝试使用布尔型 数据库名长度:?id=1')&&a ...

  2. [SimHash] the Hash-based Similarity Detection Algorithm

    The current information explosion has resulted in an increasing number of applications that need to ...

  3. markdown语法示例

    现在是我在学习Markdown时做的笔记.学完这些Markdown的基本使用已经不成问题. 1. 标题设置(让字体变大,和word的标题意思一样)在Markdown当中设置标题,有两种方式:第一种:通 ...

  4. xml配置文件特殊符号的处理方法

    2017.7.19遇到问题:偶然出现“认证失败,请重新登录”的现象   在xml中英文问号“?”是可以被正常解析的,但是以下这几种符号是不能正常解析的:分别是“&”.“<”.“>” ...

  5. mybatis批量插入oracle

    <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO TEST( ...

  6. 2-Second Scrum Meeting-20151202

    任务安排 闫昊: 今日完成:设计学习进度的管理. 明日任务:请假.(编译+计组,压力有点大) 金哉仁: 今日完成:继续商讨APP相关界面与设计,安装AndroidStudio. 明日任务:请假.(编译 ...

  7. 软件团队项目第一次Sprint评价(评价人:张家军)

    组号                      组名 缺点及建议                   1 理财猫 (1)没有附带的计算器 (2)支入支出没有详细菜单说明 (3)界面背景单调       ...

  8. 《JavaScript》数组Array

    构造函数 var arr1 = new Array();// [] 空数组 var arr2 = new Array(3);//定义长度,0是空数组 var arr3 = new Array(1,2, ...

  9. iOS开发学习-放大长图与屏幕等宽

    /* 需要得到一个图片的放大比例,这个比例就是屏幕的宽度与图片真实宽度的比值 */ CGFloat newZoomScale = LZ_SCREEN_WIDTH / [_photoImageView. ...

  10. Task 6.4 冲刺Two之站立会议8

    今天团队主要进行了用户使用的部分,因为软件操作相对来说比较复杂,因为要改很多东西,比方用户注册,还有更改软件连接服务器的IP.所以我们需要对用户进行详细地讲解.