【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$的边 然后 ...
随机推荐
- MyEclipse Update Progress Error解决方法
MyEclipse Update Progress Error现象:频繁弹出Update Progress(Time of error:……)窗口..log文件里 org.eclipse.swt.SW ...
- cookie和session是否可以保存对象
session看了一下,是可以保存对象的.语法很普通,但是cookie的话本身是只能保存string类型的信息的,这就需要先序列化,然后接收的页面反序列化后形成对象调用,为了防止乱码,需要在数据传输的 ...
- HDU 5489 Removed Interval 2015 ACM/ICPC Asia Regional Hefei Online (LIS变形)
定义f[i]表示以i为开头往后的最长上升子序列,d[i]表示以i为结尾的最长上升子序列. 先nlogn算出f[i], 从i-L开始枚举f[i],表示假设i在最终的LIS中,往[0,i-L)里找到满足a ...
- 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest J Computer Network1 (缩点+最远点对)
题意:在连通图中,求一条边使得加入这条边以后的消除的桥尽量多. 在同一个边双连通分量内加边肯定不会消除桥的, 求边双连通分量以后缩点,把桥当成边,实际上是要选一条最长的链. 缩点以后会形成一颗树,一定 ...
- Android(java)学习笔记129:对ListView等列表组件中数据进行增、删、改操作
1. ListView介绍 解决大量的相似的数据显示问题 采用了MVC模式: M: model (数据模型) V: view (显示的视图) C: controller 控制器 入门案例: aci ...
- springmvc 的原理分析
1. 用户发送请求至前端控制器(DispatcherServlet) 2.DispatcherServlet 将受到的请求调用HandlerMapping 处理映射器 3.处理器映射器根据配置注解找到 ...
- 在DataGridView控件中隔行换色
实现效果: 知识运用: DataGridViewRow类的公共属性DefaultCellStyle的BackColor属性 public Color BackColor {get; set;} 实现代 ...
- 用python Image读图
https://www.cnblogs.com/kongzhagen/p/6295925.html import os name = [] with open('/media/hdc/xing/Dee ...
- laydate时间控件绑定回调事件
onclick="laydate({istime: true, format: 'YYYY-MM-DD',choose:checkDate});" //回调函数内容 functio ...
- Linux菜鸟起飞之路【十】进程管理
一.基本概念 进程:程序的一次动态执行 守护进程:在后台运行并提供系统服务的进程 僵尸进程:完成了生命周期但却依然留在进程表中的进程,我们称之为 “僵尸进程” 父进程:指已创建一个或多个子进程的进程. ...