题目链接 \(Description\) 给定一个长为n的序列,每次可以反转 \([l,r]\) 区间,代价为 \(r-l+1\).要求在\(4*10^6\)代价内使其LIS长度最长,并输出需要操作的数量及每个反转操作. \(n\leq32000\). \(Solution\) 显然,需要在4e6的代价内将\(1\sim n\)尽可能排好序.(而且不一定要反转一大段区间,可以交换相邻元素实现一个元素的移动) Subtask2 \(n\leq1000\) 可以用冒泡排序将每个元素放到应放的位置上,…
传送门 第一问直接$dp$解决,求出$len$ 然后用$f[i]$表示以$i$为结尾的最长不下降子序列长度,把每一个点拆成$A_i,B_i$两个点,然后从$A_i$向$B_i$连容量为$1$的边 然后考虑$f[i]$,如果$f[i]==1$,则从$s$向$A_i$连边,如果$f[i]==len$,那么从$B_i$向$t$连边 然后将每一个$j<i,f[j]+1==f[i],a[j]\leq a[i]$的$j$向$i$连边 以上容量全为$1$ 建完图之后跑一个最大流 这样可以保证分层图里选出来的不…
死于开小数组的WA?! 第一问n方dp瞎搞一下就成,f[i]记录以i结尾的最长不下降子序列.记答案为mx 第二问网络流,拆点限制流量,s向所有f[i]为1的点建(s,i,1),所有f[i]为mx(i+n,t,1),然后对于j<i&&a[j]<=a[i]&&f[i]==f[j]+1连接(j+n,i,1)表示可以转移,然后跑dinic记录答案ans 第三问也是网络流但是不用重建图,直接在残量网络上加上(1,1+n,inf)(s,1,inf),如果f[n]==mx,(…
啊啊啊,再把MAXN和MAXM搞反我就退役 层次图求不相交路径数 第一问简单DP 第二问想办法把每一个不上升子序列转化成DAG上的一条路径,就转换成了求不相交路径数 因为每一个数只能用一次,所以要拆点 对与dp[i]==1连一条从s到i的边,对于dp[i]==ans1连一条从i到t的边 对于dp[j]==dp[i]+1,且num[j]>=num[i],连一条从i到j的边, 跑最大流即可 第三问将对应的边容量改为inf即可 #include <iostream> #include <…
Code: #include<cstdio> #include<iostream> #include<vector> #include<algorithm> #include<queue> #include<cstring> using namespace std; const int INF=1000000; const int maxn=600; # define pb push_back int A[maxn],f[maxn];…
最长不下降子序列的nlogn算法 见 http://www.cnblogs.com/mengxm-lincf/archive/2011/07/12/2104745.html 这题是最长不上升子序列,倒过来当最长不下降子序列搞就行. 若是最长上升子序列,将upper_bound改成lower_bound即可. #include<cstdio> #include<algorithm> using namespace std; ,d[],b[],k=,t[],l[]; int* p; i…
https://www.luogu.org/problemnew/show/P2766 注:题目描述有误,本题求的是最长不下降子序列 方案无限多时输出 n 网络流求方案数,长见识了 第一问: DP 同时得到f[i] 表示 以第i个数为开头的最长不下降子序列长度 第二问: 每个点拆出2个点 i<<1,i<<1|1,之间连流量为1的边 如果f[i]==最长长度,源点向i<<1连流量为1的边 如果f[i]==1,i<<1|1向汇点连流量为1的边 如果 i<j…
最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: REP(i,n) { f[i]=; FOR(j,,i-) ); } DP是O(n^2)的,我感觉已经不错了不过还有超碉的nlogn的方法. nlogn的方法: 用栈和二分查找. 遇到一个元素a[i],若它不小于栈顶s[top],直接入栈:若小于栈顶,则在栈中二分查找,用它替换栈中比它大的第一个元素.最终栈的大小就是最长不下降子序列的长度(栈中元素并不…
#include<stdio.h> ] , temp[] ; int n , top ; int binary_search (int x) { ; int last = top ; int mid ; while (fir <= last ) { mid = (fir + last) / ; if ( x <= temp[mid] ) { last = mid - ; } else { ] ) ; else fir = mid + ; } } } int main () { //…
P1049 最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降子序列的长度 测试样例1 输入 3 1 2 3 输出 3 备注 N小于5000for each num <=maxint   题意:中文题意   题解:不下降也就是>=   n^n  dp[i] 表示以a[i]结尾的最长不下降子序列的长度 /**********************…