Monotonicity 2[POI2010]】的更多相关文章

题目描述 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k].选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1].求出L的最大值. 输入 第一行两个正整数,分别表示N和K (N, K <= 500,000).第二行给出N个正整数,第i个正整数表示a[i] (a[i] <= 10^6).第三行给出K个空格隔开关系符号(>.<或=),第i个表示s[i]. 输出 一个正整数,表示L的…
[Poi2010]Monotonicity 2 题目 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. 选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1]. 求出L的最大值. INPUT 第一行两个正整数,分别表示N和K (N, K <= 500,000). 第二行给出N个正整数,第i个正整数表示a[i] (a[i] <= 10^6). 第三行给出K个空格隔开关系符号(>.<…
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. 选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1]. 求出L的最大值. Input 第一行两个正整数,分别表示N和K (N, K <= 500,000). 第二行给出N个正整数,第i个正整数表示a[i] (a[i] <= 10^…
[BZOJ2090/2089][Poi2010]Monotonicity Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k].选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1].求出L的最大值. Input 第一行两个正整数,分别表示N和K (N, K <= 500,000).第二行给出N个正整数,第i个正整数表示a[i] (a[i] <= 10^6).第三行给出K…
这道题考试的时候先打了个dfs暴力.又打了个O(n²)的动规.然后竟然心血来潮拍了一下..明明知道过不去的...然后水了50分(20个测试点这么多啊啊啊啊). 因为它已经提前给你如果长度为i时下一位的符号,显然O(n²)的打法大家都会打. for(i..1..n) for(j..1..i-1) if(符合条件) f[i]=max(f[i],f[j]+1); 然后我们就考虑如何降低复杂度. 因为我们要求的是符合条件的前缀最大值,可以使用线段树来维护. 线段树的下标是权值,内容是最长长度. 一共三种…
树状数组优化dp 可以证明最优解一定是通过之前的最优转移过来的,所以每一个点只需要保存以该节点为结尾的最长长度即可 对于不同符号,等于号维护数组,大于小于维护树状数组 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #define N 500005 using namespace std; int n,m,a[N],…
题解: 首先想到了标算..然后证明了一发是错的(事实证明很智障) 先说正确性比较显然的O(n^2)算法 令f[i][j]表示前i个物品,匹配到第j个括号,最大值是多少 g[i][j]表示前i个物品,匹配到第j个括号,最小值是多少 然后这个转移是O(1)的 状态是n^2的 被状态局限了就没法优化了 标算: 令f[i]表示取第i个的情况下最大到达的位置,f[i+1]由f[ 1-----i ]转移 我们来证明一下这个的正确性 原命题:每个f[i]一定是由前面某个f[j]转移过来 逆命题:其中有一个f[…
设f[i]表示以i为结尾的最长的合法序列的长度,=号直接维护,<号和>号用两棵树状数组维护即可,时间复杂度$O(n\log n)$. #include<cstdio> #define N 1000000 int n,k,i,j,a[N],e[N+1],bl[N+1],bg[N+1],f[N],ans;char s[N]; inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<…
双倍经验一眼题... f[i][1/2]表示以i结尾,当前符号应该是</>的最长上升子序列, 用BIT优化转移就好 =的话就不用说了吧= = #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> using namespace std; , inf=1e9+; int n, m, N, ans, ans1,…
这个dp乍看不科学,仔细一看更不科学,所以作为一个执着BOY,我决定要造数据卡死波兰人民,但是我造着造着就......证出来了......... 这个就是把 < > =分开讨论每次找到f[i] 即以i为结尾的最长长度,然后一顿转移,那么我们发现如果只是讨论 符号那么由于符号顺序影响 我们的得到的是一个有后效性的dp 就是说我们这个时候找到最优解可能会影响最优解的得到,那么这个dp的正确性是怎样的呢? 证明: 首先我们假设我们找到了一个不是全部从最优转移点转移来的最优序列那么:I.最后一个点一定…