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. React Native移动开发实战-5-Android平台的调试技巧

    Android平台的调试和其他平台的调试也很类似,例如:在Android Studio打开的工程中,打开源码MainActivity.java,然后,将鼠标移至代码编辑区的左侧后,单击鼠标即可添加断点 ...

  2. 【NLP】使用bert

    # 参考 https://blog.csdn.net/luoyexuge/article/details/84939755 小做改动 需要: github上下载bert的代码:https://gith ...

  3. [持久更新] 剑指offer题目Python做题记录

    第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...

  4. 爬虫_处理js动态加载

    1.selenium模块下载网页提取url,[煎蛋网] https://www.cnblogs.com/fat39/p/9865949.html#tag5 2.该网页加密了url,通过js获取图片.分 ...

  5. Daily Scrumming* 2015.10.26(Day 7)

    一.总体情况总结 今天我们开会具体讨论了一下接下来的任务.还详细讨论了一下分数的分配,具体分数分配我们会在下一篇博客中详细说明. 我们下一周大致的工作安排如下: 1.UI:完成社团后台界面的设计,以及 ...

  6. 《JavaScript》split和join

    首先了解split和join两个函数 split 根据条件截断字符串,返回数组 //str.split(option,length) 字符串转数组 //option:表示分割依据 //length:用 ...

  7. Reaction to 构造之法 of Software Engineering From The First Chapter toThe Fifth Chapter

    几个星期前,我阅读过一篇文章,一位老师教导自己的学生要积极地去阅读文学文献,其中,我很欣赏他的一句话:“Just think of liturature as if you're reading a ...

  8. 索引超出了数组界限。 在 System.Collections.Generic.Dictionary`2.Resize

    博问:Dictionary 超出了数组界限 异常: Exception type: IndexOutOfRangeException Exception message: 索引超出了数组界限. 在 S ...

  9. 项目复审—Alpha阶段

    项目复审-Alpha阶段 小组的名字和链接 优 点 缺 点 排名 [别看了你没救队]http://www.cnblogs.com/liaoyujun233/p/9016362.html 此队优点很多, ...

  10. 11th 单元测试工具JUnit的学习

    1.写好一个简易的四则运算的程序 UnitTest类文件: public class UnitTest { int a; int b; int answer;//正确答案 public int plu ...