首页 > 其他分享 >[CF1580D]Subsequence

[CF1580D]Subsequence

时间:2023-10-10 16:35:19浏览次数:45  
标签:CF1580D sz rs int times Subsequence ls dp

D - Subsequence

发现\(f(i,j)\)不好处理,考虑将其转换成另一个函数

考虑笛卡尔树,\(\min(a_i,a_{i+1},...,a_j)\)就是在笛卡尔树上,\(i\)和\(j\)的\(lca\)

那么就可以将问题转移到笛卡尔树上,设\(dp[x][c]\)表示以\(x\)所处的子树中,选了\(c\)个的最大价值

那么显然有:

\[dp[x][i+j]=\max(dp[x][i+j],dp[ls[x]][i]+dp[rs[x]][j]- 2\times i\times j\times a[x])\\ dp[x][i+j+1]=\max(dp[x][i+j+1],dp[ls[x]][i]+ dp[rs[x]][j]+1\times m\times a[x]-(2\times i\times j+(i+j)\times 2+1)\times a[x]); \]

复杂度:看似\(O(NM^2)\)实则\(O(NM)\)

树卷积相关理论可证

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e3+5;
const ll INF=1e18;
int n,m,a[N];
int ls[N],rs[N],stk[N],top,sz[N];
ll dp[N][N]; 
void dfs(int x){
	sz[x]=1;
	if(ls[x]) dfs(ls[x]),sz[x]+=sz[ls[x]];
	if(rs[x]) dfs(rs[x]),sz[x]+=sz[rs[x]];
	for(int i=0;i<=min(m,sz[x]);++i) dp[x][i]=-INF;
	for(int i=0;i<=min(m,sz[ls[x]]);++i)
		for(int j=0;j<=sz[rs[x]]&&i+j<=m;++j){
			dp[x][i+j]=max(dp[x][i+j],dp[ls[x]][i]+dp[rs[x]][j]-2ll*i*j*a[x]);
			if(i+j+1<=m) dp[x][i+j+1]=max(dp[x][i+j+1],dp[ls[x]][i]+dp[rs[x]][j]+1ll*m*a[x]-(2ll*i*j+(i+j)*2ll+1ll)*a[x]);
		}
}
int main(){//
	scanf("%d%d",&n,&m);
	for(int i=1,k;i<=n;++i){
		scanf("%d",&a[i]),k=top;
		while(k&&a[stk[k]]>a[i]) --k;
		if(k) rs[stk[k]]=i;
		if(k<top) ls[i]=stk[k+1];
		stk[++k]=i,top=k;
	}
	dfs(stk[1]);
	printf("%lld",dp[stk[1]][m]);
 
	return 0;
}

标签:CF1580D,sz,rs,int,times,Subsequence,ls,dp
From: https://www.cnblogs.com/LuoyuSitfitw/p/17755035.html

相关文章

  • Codeforces Round 750 (Div. 2) B. Luntik and Subsequences
    给一个数组\(a_1,a_2,\cdots,a_n\),定义\(s=\sum_{i=1}^{n}a_i\)。询问有多少个\(a\)的子序列满足\(\suma_{i_k}=s-1\)。显然要选出一个\(1\)不加入子序列,任意一个\(0\)可以加入或不加入子序列。于是\(ans=\binom{cnt1}{1}\cdot2^{cnt0}\)。vi......
  • Xor-Subsequence (字典树优化DP)
     思路;明显的是,后一个i要从前面一个进行更新, 利用dpeasy版本ai<=200,发现当n>=300时,对他是没有影响的,这样比较好记录ans进行更新,利用数据结构处理hard版本拆位,利用字典树dp,把参数变成相同的参数,a[i]和i,(比大小:前K位一样第K+1位不一样......
  • abc271e Subsequence Path
    E-SubsequencePath第一眼看过去感觉又是什么魔改BFS的样子,但是感觉不好弄但是往dp上想就很容易\(f[i]\)表示走到i的最小代价,按着给出的序列顺序转移即可,转移是O(1)的。代码非常简单#include<cstdio>#include<algorithm>#definefo(i,a,b)for(int(i)=(a);(i)<=(b);(i)......
  • [ABC248Ex] Beautiful Subsequences
    题意给定排列$P_n$和整数$k$,求满足如下条件的点对$(l,r)$数量。$1\lel\ler\len$。$\max_{i=l}^rP_i-\min_{i=l}^rP_i\ler-l+k$。数据范围\(1\leqN\leq1.4\times10^5\)\(P\)为\(1\)到\(N\)的排列\(0\leqK\leq3\)题解......
  • [LeetCode][300]longest-increasing-subsequence
    ContentGivenanintegerarraynums,returnthelengthofthelongeststrictlyincreasingsubsequence. Example1:Input:nums=[10,9,2,5,3,7,101,18]Output:4Explanation:Thelongestincreasingsubsequenceis[2,3,7,101],thereforethelengthis4.E......
  • [ARC125D] Unique Subsequence
    设\(pre_i\)表示在\(i\)之前最后一个和\(i\)相同的数的位置,\(dp_i\)表示第\(i\)个数为结尾的序列的合法方案数。对于\(pre_i=0\),即在\(i\)之前不存在与\(i\)相同的数,\(dp_i\)由\(\left[1,i-1\right]\)转移过来。由于这个数还没有在之前出现过,它本身也是一......
  • [AGC024F] Simple Subsequence Problem
    ProblemStatementYouaregivenaset$S$ofstringsconsistingof0and1,andaninteger$K$.Findthelongeststringthatisasubsequenceof$K$ormoredifferentstringsin$S$.Iftherearemultiplestringsthatsatisfythiscondition,findthelexic......
  • [ARC150F] Constant Sum Subsequence
    ProblemStatementWehaveasequenceofpositiveintegersoflength$N^2$,$A=(A_1,\A_2,\\dots,\A_{N^2})$,andapositiveinteger$S$.Forthissequenceofpositiveintegers,$A_i=A_{i+N}$holdsforpositiveintegers$i\(1\leqi\leqN^2-N)$,an......
  • POJ 1458 Common Subsequence(动态规划)
    传送门代码如下:#include<iostream>#include<cstdio>usingnamespacestd;intmaxLen[1000][1000];intmain(){strings1,s2;while(cin>>s1>>s2){intlength1=s1.length();intlength2=s2.length();......
  • Subsequence Addition
    #SubsequenceAddition(HardVersion)##题面翻译本题为困难版,两题的唯一区别在于数据范围的大小。数列$a$最开始只有一个数$1$,你可以进行若干次操作,每次操作你可以选取$k$个数($k$无限制,小于等于$a$的大小即可),将这$k$个数的和放入$a$的任意一个位置。给定一个长......