题意:给你一个序列,求不严格上升lcs长度/最多有几个没有重复元素的lcs/如果x1和xn可以多次出现,求最多有几个lcs?n<=500.

标程:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=;
const int inf=0x3f3f3f3f;
queue<int> q;
int cnt=,dis[N],S,T,x1,xn,a[N],f[N],Head[N],ans,head[N],n,Max,tmp,ans1;
struct node{int to,next,w;}num[N*N*];
void add(int x,int y,int w)
{num[++cnt].to=y;num[cnt].next=head[x];num[cnt].w=w;head[x]=cnt;
num[++cnt].to=x;num[cnt].next=head[y];num[cnt].w=;head[y]=cnt;}
void build()
{
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
if (a[i]<=a[j]&&f[i]+==f[j]) add((i==)?x1:((i==n)?xn:i),j,);
for (int i=;i<=n;i++)
{
if (f[i]==) add(S,i,);
if (f[i]==Max) add((i==)?x1:((i==n)?xn:i),T,);
}
add(,x1,);add(n,xn,);
}
bool bfs()
{
memset(dis,,sizeof(dis));dis[S]=;
q.push(S);
while (!q.empty())
{
int now=q.front();q.pop();
for (int i=head[now];i;i=num[i].next)
if (num[i].w&&!dis[num[i].to])
dis[num[i].to]=dis[now]+,q.push(num[i].to);
}
return dis[T]!=;
}
int dfs(int x,int mm)
{
int tmp=mm;
if (x==T) return mm;
for (int &i=Head[x];i&&tmp;i=num[i].next)
if (num[i].w&&dis[num[i].to]==dis[x]+)
{
int t=dfs(num[i].to,min(num[i].w,tmp));
tmp-=t;num[i].w-=t;num[i^].w+=t;
}
return mm-tmp;
}
void dinic()
{
while (bfs())
{
memcpy(Head,head,sizeof(head));
while (tmp=dfs(S,inf)) ans+=tmp;
}
}
int main()
{
scanf("%d",&n);S=n+;T=S+;x1=T+;xn=x1+;
for (int i=;i<=n;i++) scanf("%d",&a[i]);
f[]=;
for (int i=;i<=n;i++)
{
for (int j=;j<i;j++)
if (a[i]>=a[j]) f[i]=max(f[i],f[j]);
f[i]++;
}
for (int i=;i<=n;i++) Max=max(Max,f[i]);
printf("%d\n",Max);
build();dinic();
printf("%d\n",ans);ans1=ans;
add(,x1,inf);add(n,xn,inf);
for (int i=;i<=n;i++)
{
if (f[i]==) add(S,i,inf);
if (f[i]==Max) add((i==)?x1:((i==n)?xn:i),T,inf);
}
dinic();
if (Max==) printf("%d\n",ans1);else printf("%d\n",ans);
return ;
}

易错点:1.需要特判lcs=1时询问3的答案和询问2是一样的。不然会错。

题解:网络流+拆点

第一问直接dp。

第二问对于i<j&&a[i]<=a[j]&&f[i]+1==f[j]的(i,j)连容量为1的边,f[i]=1向S连边,f[i]=Max向T连边。跑最大流。

第三问可以直接在第二问的残图上跑,对于x1和xn点拆点(可以在第二问建图时就拆好),设置点流量为inf。同时对于所有向源汇连的边都设为inf。

loj6005 [网络流24题]最长递增子序列的更多相关文章

  1. Cogs 731. [网络流24题] 最长递增子序列(最大流)

    [网络流24题] 最长递增子序列 ★★★☆ 输入文件:alis.in 输出文件:alis.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 给定正整数序列x1,-, xn. ( ...

  2. COGS731 [网络流24题] 最长递增子序列(最大流)

    给定正整数序列x1,..., xn (n<=500).(1)计算其最长递增子序列的长度s.(2)计算从给定的序列中最多可取出多少个长度为s的递增子序列.(3)如果允许在取出的序列中多次使用x1和 ...

  3. COGS743. [网络流24题] 最长k可重区间集

    743. [网络流24题] 最长k可重区间集 ★★★   输入文件:interv.in   输出文件:interv.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: «编 ...

  4. [网络流24题]最长k可重区间集[题解]

    最长 \(k\) 可重区间集 题目大意 给定实心直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取开区间集 ...

  5. [网络流24题] 最长K可重区间集问题

    题目链接:戳我 当时刷24题的时候偷了懒,没有写完,结果落下这道题没有写qwq结果今天考试T3中就有一部分要用到这个思想,蒟蒻我硬是没有想到网络流呜呜呜 最大费用流. 就是我们考虑将问题转化一下,转化 ...

  6. P2766 [网络流24题]最长不下降子序列问题

    ha~ «问题描述: 给定正整数序列$x_1,...,x_n$ .$n<=500$ 求(1)计算其最长不下降子序列的长度$s$. (2)计算从给定的序列中最多可取出多少个长度为$s$的不下降子序 ...

  7. 网络流24题-最长k可重线段集问题

    最长k可重线段集问题 时空限制1000ms / 128MB 题目描述 给定平面 x−O−y 上 n 个开线段组成的集合 I,和一个正整数 k .试设计一个算法,从开线段集合 I 中选取出开线段集合 S ...

  8. [网络流24题] 最长k可重区间集问题 (费用流)

    洛谷传送门 LOJ传送门 很巧妙的建图啊...刚了$1h$也没想出来,最后看的题解 发现这道题并不类似于我们平时做的网络流题,它是在序列上的,且很难建出来二分图的形. 那就让它在序列上待着吧= = 对 ...

  9. [网络流24题]最长k可重线段集[题解]

    最长 \(k\) 可重线段集 题目大意 给定平面 \(x-O-y\) 上 \(n\) 个开线段组成的集合 \(I\) ,和一个正整数 \(k\) .试设计一个算法,从开线段集合 \(I\) 中选取开线 ...

随机推荐

  1. [zz]使用OleDb,将Excel导入DataSet

    本方法,将传入的Excel文件内所有的Sheet内的数据都填充入DataSet中.这是一个简单快捷的方法,不足之处是不适合带有格式复杂的Excel文件.(比如:有合并单元格的) public clas ...

  2. C++之关键字&标识符命名规则

    关键字 **作用:**关键字是C++中预先保留的单词(标识符) * **在定义变量或者常量时候,不要用关键字** C++关键字如下: 提示:在给变量或者常量起名称时候,不要用C++得关键字,否则会产生 ...

  3. 16-MySQL-Ubuntu-数据表的查询-分组与聚合(五)

    分组(group by)一般与聚合结合使用 (1)查询按性别分组 select gender from students group by gender; (2)查询按性别分组并统计每组的数量sele ...

  4. **JLink Warning: Mis-aligned memory write: Address: 0x20000000, NumBytes: 2, Alignment: 2 (Halfword-aligned)

    网上也有同学遇到这个问题,http://www.openedv.com/thread-113049-1-3.html 根据他的经验我也重新安装了Jlink驱动: 顺便注意Dialog DLL:TARM ...

  5. opencv remap 函数

    remap 查看:https://blog.csdn.net/yangfengman/article/details/52769716 remap 其实就是一个坐标到另一个坐标的映射,比如经常用在鱼眼 ...

  6. iOS组件化开发-发布私有库

    远程索引库 将远程索引库添关联到本地 pod repo 查看本地已关联仓库源 pod repo add 本地索引库名称 远程索引库仓库地址 pod repo update 索引库名称 pod repo ...

  7. Hadoop和Spark的统一部署

  8. JS对象 Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒)。 定义一个时间对象 : var Udate=new Date();Date()的首字母须大写

    Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义一个时间对象 : var Udate=new Date(); 注意:使用关键字new,Date()的首 ...

  9. python的异常捕捉

    你可能会说既然有万能异常Exception,那么我直接用上面的这种形式就好了,其他异常可以忽略 你说的没错,但是应该分两种情况去看 1.如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一 ...

  10. 7.ICMP与ping

    ping是基于ICMP(Internet Control Message Protocol)协议工作的   ICMP报文封装在IP包里,作为“侦察兵”,非常轻巧. ICMP报文的类型有很多,最常用的是 ...