【Luogu】P2766最长不下降子序列问题(暴力网络流)
水题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最长不下降子序列问题(暴力网络流)的更多相关文章
- 【题解】Luogu P2766 最长不下降子序列问题
原题传送门 实际还是比较套路的建图 先暴力dp一下反正数据很小 第一小问的答案即珂以求出数列的最长不下降子序列的长度s 考虑第二问如何做: 将每个点拆点 从前向后连一条流量为1的边 如果以它为终点的最 ...
- luogu P2766 最长不下降子序列问题
第一问可以直接DP来做,联想上一题,线性规划都可以化为网络流?我们可以借助第一问的DP数组,来建立第二问第三问的网络流图,考虑每一种可能,都是dp数组中满足num[i]>=num[j]& ...
- [**P2766** 最长不下降子序列问题](https://www.luogu.org/problemnew/show/P2766)
P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(dp(i)\)代表以\(i\)为起点的\(LIS\)是多少.转移太显然了 \[ dp(i)=m ...
- 【24题】P2766最长不下降子序列问题
网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(d ...
- P2766 最长不下降子序列问题 网络流重温
P2766 最长不下降子序列问题 这个题目还是比较简单的,第一问就是LIS 第二问和第三问都是网络流. 第二问要怎么用网络流写呢,首先,每一个只能用一次,所以要拆点. 其次,我们求的是长度为s的不下降 ...
- P2766 最长不下降子序列问题 网络流
link:https://www.luogu.org/problemnew/show/P2766 题意 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的 ...
- 网络流 之 P2766 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- P2766 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- 洛谷P2766 最长不下降子序列问题(最大流)
传送门 第一问直接$dp$解决,求出$len$ 然后用$f[i]$表示以$i$为结尾的最长不下降子序列长度,把每一个点拆成$A_i,B_i$两个点,然后从$A_i$向$B_i$连容量为$1$的边 然后 ...
随机推荐
- TortoiseGit和git bash冲突解决
软件版本 TortoiseGit版本: TortoiseGit 2.5.0.0 (C:\Program Files\TortoiseGit\bin) git version 2.8.1.windows ...
- UVA1607 Gates 与非门电路 (二分)
题意:给你一个按发生时间的序列,表示与非门电路的输入,一开始全部输入是x,现在要改成尽量少的x,实现相同的功能. 题解:电路功能只有4中0,1,x,非x.那么如果一开始x改变了,输出结果不变,那么说明 ...
- Bootstrap历练实例:带链接的警告
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- oracle 快速复制一张表,并在此创建索引,日志及并行度
复制表结构及其数据 create table table_name_new as select * from table_name_old 只复制表结构 create table table_name ...
- Ansible的使用和模块化深入
Ansible配置 配置文件:/etc/ansible/ansible.cfg [default] 默认配置 inventory = /etc/ansible/hosts主机清单 library = ...
- Thinkphp5的安装
很长没有码代码了,现在开始做这件事情的意义已经完全与以前不一样了.因为最近有相当长的一段休息时间,是个学习的好时间啊.之前接触过TP3.2,听说后来的版本有挺大的改动,因此呢,现在终于有时间可以好好的 ...
- destoon 支付异步接口文件 notify.php 调试方式
在if($verify_result) { 之前复制这三个变量 就可以直接访问notify.php 启用调试模式 或者 逐步echo 相关变量来调试 错误原因 notify.php没有入口文件 是 ...
- python 类的使用
目录 类的继承 类的派生 类的组合 菱形继承问题 多态与多态性 dataclass的使用 类的继承 什么是继承,在生活中,子承父业,父亲和儿子就是继承的关系 在python中,父类和子类(派生类),父 ...
- SQL防止重复提交和Filter
/class User package com.neuedu.bean; import java.io.Serializable; public class User implements Seria ...
- Linux学习-什么是 X Window System
Unix Like 操作系统不是只能进行服务器的架设而已,在美编.排版.制图.多媒体应用上也是有其 需要的. 这些需求都需要用到图形接口 (Graphical User Interface, GUI) ...