题目链接

  水题qwq,数据都那么水。

  我要是出数据的人我就卡$n^3$建图。

  qwq。

  然而这么水的题我!居!然!没!有!1!A!!还!提!交!了!五!遍!!!

  md从现在开始要锻炼1A率了

  看我从今往后做完一道题之后至少检查TM十分钟

  可恶qwq。

  第一问$n^2$sbDP可解。然而你们知道我提交五遍TM是错在哪里了吗?????

  我TM就错在这个pj-,sb到不能再sb的sb暴力DP上!!!

  气死我了!!!

  关于第二问和第三问,先拆点再拆点qwq。

  先把每个点拆成入点和出点用来限制流量,然后把出点拆成s个点为的是跑最大流的时候统计比较方便。

  能跑到汇点就是一种方式,跑不到就说明没有那么长的最长不下降子序列。

  第三问暴力修改边容量再跑一遍即可。

  qwqqqqqqqqq我网络流都没写错栽在一个入门DP上

  qwqqqqqq

  

#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#define maxm 200010
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int n,m;
int q[];
int s[];
int ne[][],tot[];
int Start,End;
inline int count(int i){ return i&?i+:i-; } struct Edge{
int next,to,val;
}edge[maxm*];
int head[maxm],num;
inline void addedge(int from,int to,int val){
edge[++num]=(Edge){head[from],to,val};
head[from]=num;
}
inline void add(int from,int to,int val){
addedge(from,to,val);
addedge(to,from,);
} bool vis[maxm];
int dfn[maxm];
int list[maxm]; bool bfs(){
memset(vis,,sizeof(vis)); vis[Start]=; dfn[Start]=;
queue<int>q; q.push(Start);
while(!q.empty()){
int from=q.front();q.pop();
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].val==||vis[to]) continue;
vis[to]=; dfn[to]=dfn[from]+;
q.push(to);
}
}
return vis[End];
} int dfs(int x,int val){
if(x==End||val==) return val;
int flow=; vis[x]=;
for(int &i=list[x];i;i=edge[i].next){
int to=edge[i].to;
if(vis[to]||edge[i].val==||dfn[to]!=dfn[x]+) continue;
int now=dfs(to,min(val,edge[i].val));
val-=now; flow+=now; edge[i].val-=now; edge[count(i)].val+=now;
if(val<=) break;
}
if(val!=flow) dfn[x]=-;
return flow;
} int maxflow(){
int ans=;
while(bfs()){
memset(vis,,sizeof(vis));
for(int i=Start;i<=End;++i) list[i]=head[i];
int now=dfs(Start,0x7fffffff);
if(!now) break;
ans+=now;
}
return ans;
} int main(){
int n=read();
for(int i=;i<=n;++i){
q[i]=read();s[i]=;
}
m=;
for(int i=n-;i>=;--i){
for(int j=i+;j<=n;++j){
if(q[i]>q[j]) continue;
if(s[i]<s[j]+) s[i]=s[j]+;
if(m<s[i]) m=s[i];
}
}
printf("%d\n",m);
End=(m+)*n+n+;
for(int i=;i<=n;++i){
add(Start,i,0x7fffffff);
add(i,i+n,);
add(m*n+i,End,);
for(int j=i+;j<=n;++j){
if(q[i]>q[j]) continue;
for(register int k=;k<m;++k) add(k*n+i,(k+)*n+j,);
}
}
int ans=maxflow();
printf("%d\n",ans);
int ret=;
for(int j=head[ret];j;j=edge[j].next){
int to=edge[j].to;
if(to<ret) continue;
edge[j].val+=;
}
/*for(int j=head[1];j;j=edge[j].next){
int to=edge[j].to;
edge[j].val+=1234567;
}*/
ret=m*n+n;
for(int j=head[ret];j;j=edge[j].next){
int to=edge[j].to;
if(to!=End) continue;
edge[j].val+=;
}
printf("%d",ans+maxflow());
return ;
}

【Luogu】P2766最长不下降子序列问题(暴力网络流)的更多相关文章

  1. 【题解】Luogu P2766 最长不下降子序列问题

    原题传送门 实际还是比较套路的建图 先暴力dp一下反正数据很小 第一小问的答案即珂以求出数列的最长不下降子序列的长度s 考虑第二问如何做: 将每个点拆点 从前向后连一条流量为1的边 如果以它为终点的最 ...

  2. luogu P2766 最长不下降子序列问题

    第一问可以直接DP来做,联想上一题,线性规划都可以化为网络流?我们可以借助第一问的DP数组,来建立第二问第三问的网络流图,考虑每一种可能,都是dp数组中满足num[i]>=num[j]& ...

  3. [**P2766** 最长不下降子序列问题](https://www.luogu.org/problemnew/show/P2766)

    P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(dp(i)\)代表以\(i\)为起点的\(LIS\)是多少.转移太显然了 \[ dp(i)=m ...

  4. 【24题】P2766最长不下降子序列问题

    网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(d ...

  5. P2766 最长不下降子序列问题 网络流重温

    P2766 最长不下降子序列问题 这个题目还是比较简单的,第一问就是LIS 第二问和第三问都是网络流. 第二问要怎么用网络流写呢,首先,每一个只能用一次,所以要拆点. 其次,我们求的是长度为s的不下降 ...

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

    link:https://www.luogu.org/problemnew/show/P2766 题意 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的 ...

  7. 网络流 之 P2766 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  8. P2766 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  9. 洛谷P2766 最长不下降子序列问题(最大流)

    传送门 第一问直接$dp$解决,求出$len$ 然后用$f[i]$表示以$i$为结尾的最长不下降子序列长度,把每一个点拆成$A_i,B_i$两个点,然后从$A_i$向$B_i$连容量为$1$的边 然后 ...

随机推荐

  1. python基础教程总结15——7 自定义电子公告板

    1. Python进行SQLite数据库操作 简单的介绍 SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身.它是遵守ACID的关联式数据库 ...

  2. [BZOJ4327]:[JZOI2012]玄武密码(AC自动机)

    题目传送门 题目描述: 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  ...

  3. 获取kafka的lag, offset, logsize的shell和python脚本

    python脚本 #!/usr/bin/env python import os import re import sys group_id=sys.argv[1] pn=sys.argv[2] ka ...

  4. StatementHandler-Mybatis源码系列

    内容更新github地址:我飞 StatementHandler接口 StatementHandler封装了Mybatis连接数据库操作最基础的部分.因为,无论怎么封装,最终我们都是要使用JDBC和数 ...

  5. javaweb基础(19)_jsp标签

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  6. Seek and Destroy-freecodecamp算法题目

    Seek and Destroy(摧毁数组) 要求 实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值. 思路 利用for循环将输入arguments中除第一项待 ...

  7. 【SAM】bzoj5084: hashit

    做得心 力 憔 悴 Description 你有一个字符串S,一开始为空串,要求支持两种操作 在S后面加入字母C 删除S最后一个字母 问每次操作后S有多少个两两不同的连续子串 Input 一行一个字符 ...

  8. pandas实践——美国人口分析

    1.导入文件,并查看数据样本 abbr = pd.read_csv("./state-abbrevs.csv")areas =pd.read_csv("./state-a ...

  9. Java-JFrame-swing嵌套浏览器步骤

    Java-JFrame-swing嵌套浏览器步骤 一.使用swing嵌套浏览器要实现的功能: 通过java的swing实现在一个窗体中嵌套一个浏览器,可以在这个浏览器中将另一个项目的内容显示出来,只需 ...

  10. 学习路由器vue-router

    vue-router:vue官方路由管理器. 功能:嵌套的路由/视图表模块化的.基于组件的路由配置路由参数.查询.通配符基于 Vue.js 过渡系统的视图过渡效果细粒度的导航控制带有自动激活的 CSS ...