YbtOJ#20240-[冲刺NOIP2020模拟赛Day10]弱者对决【笛卡尔树,区间dp】

正题

题目链接:https://www.ybtoj.com.cn/contest/68/problem/4


题目大意

m m m个三元组 ( a i , b i , c i ) (a_i,b_i,c_i) (ai,bi,ci),如果 c i ≥ m i n { x j } ( a i ≤ j ≤ b i ) c_i\geq min\{x_j\}(a_i\leq j\leq b_i) cimin{xj}(aijbi)那么可以获得 m i n { x j } min\{x_j\} min{xj}的价值,求一个 x x x序列使得价值和最大。


解题思路

如果根据 x i x_i xi构造一个笛卡尔树,那么三元组 ( a i , b i , c i ) (a_i,b_i,c_i) (ai,bi,ci)会在 L C A ( a i , b i ) LCA(a_i,b_i) LCA(ai,bi)处产生一次贡献,考虑用区间 d p dp dp构造笛卡尔树。

显然 x i x_i xi肯定是某个 c c c,所以先把 c c c离散化了

f l , r , i f_{l,r,i} fl,r,i表示已经构造出了 [ l , r ] [l,r] [l,r]这个范围的笛卡尔树,然后目前的根节点权值是 i i i时的最大价值和。

然后每次做完处理后缀和,就可以 O ( n 3 m ) O(n^3m) O(n3m)实现转移了。


c o d e code code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=55,M=4100;
int n,m,a[M],b[M],c[M],t[M],cnt[M],tot;
int f[N][N][M],g[N][N][M],s[N][N][M],z[N][N][M];
void ct(int l,int r,int k){
	memset(cnt,0,sizeof(cnt));
	for(int i=1;i<=m;i++)
		if(a[i]>=l&&a[i]<=k&&b[i]>=k&&b[i]<=r)
			cnt[c[i]]++;
	for(int i=tot;i>=1;i--)cnt[i]+=cnt[i+1];
	return;
}
void print(int l,int r,int x){
	if(!l||!r||l>r)return;x=z[l][r][x];
	print(l,g[l][r][x]-1,x);
	printf("%d ",t[x]);
	print(g[l][r][x]+1,r,x);
}
int main()
{
	freopen("baddream.in","r",stdin);
	freopen("baddream.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&a[i],&b[i],&c[i]);
		t[i]=c[i];
	}
	sort(t+1,t+1+m);
	tot=unique(t+1,t+1+m)-t-1;
	for(int i=1;i<=m;i++)
		c[i]=lower_bound(t+1,t+1+tot,c[i])-t;
	ct(1,n,5);
	for(int len=1;len<=n;len++){
		for(int l=1;l<=n;l++){
			int r=l+len-1;
			for(int k=l;k<=r;k++){
				ct(l,r,k);
				for(int i=1;i<=tot;i++){
					if(s[l][k-1][i]+s[k+1][r][i]+cnt[i]*t[i]>f[l][r][i]||!f[l][r][i])
						f[l][r][i]=s[l][k-1][i]+s[k+1][r][i]+cnt[i]*t[i],g[l][r][i]=k;
				}
			}
			for(int i=tot;i>=1;i--){
				if(s[l][r][i+1]>f[l][r][i])
					s[l][r][i]=s[l][r][i+1],z[l][r][i]=z[l][r][i+1];
				else s[l][r][i]=f[l][r][i],z[l][r][i]=i;
			}
		}
	}
	printf("%d\n",s[1][n][1]);
	print(1,n,1);
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页