WA60 求助
查看原帖
WA60 求助
148406
caocao11楼主2021/8/14 15:57

几乎是对照着第三篇题解改了,依然不知道为什么总是错第5,6,8,9个点。答案似乎总是大的出奇:比如我第8个点输出的是9223091508069726873。求大佬帮忙看看。

#include<bits/stdc++.h>
#define ll long long
#define ri register int
using namespace std;
const int N=55,M=4010;
ll f[N][N][M],ans[N],li[M],a[M],b[M],c[M],g[N][N],best[N][N][M],last[N][N][M],tot;
void dfs(int l,int r,int k){
	if(l>r) return ;
	ans[last[l][r][k]]=li[best[l][r][k]];
	dfs(l,last[l][r][k]-1,best[l][r][k]);
	dfs(last[l][r][k]+1,r,best[l][r][k]);
}
int main(){
	int i,j,k,l,n,m;
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++){
		scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
		li[i]=c[i];
	}
	sort(li+1,li+1+m);
	tot=unique(li+1,li+1+m)-li-1;
	for(i=1;i<=m;i++) c[i]=lower_bound(li+1,li+1+tot,c[i])-li;
	for(int len=1;len<=n;len++){
		for(i=1;i+len-1<=n;i++){
			j=i+len-1;
			memset(g,0,sizeof(g));
			for(k=1;k<=m;k++)
				if(i<=a[k]&&b[k]<=j)
					for(l=a[k];l<=b[k];l++)
						g[l][c[k]]++;
			for(l=i;l<=j;l++)
				for(k=tot;k>=0;k--)
					g[l][k]+=g[l][k+1];
			best[i][j][tot+1]=tot;
			last[i][j][tot+1]=i;
			for(k=tot;k>=1;k--){
				f[i][j][k]=f[i][j][k+1];
				best[i][j][k]=best[i][j][k+1];
				last[i][j][k]=last[i][j][k+1];
				for(l=i;l<=j;l++){
					if(f[i][j][k]<f[i][l-1][k]+f[l+1][j][k]+g[l][k]*li[k]){
						f[i][j][k]=f[i][l-1][k]+f[l+1][j][k]+g[l][k]*li[k];
						best[i][j][k]=k;
						last[i][j][k]=l;
					}
				}
			}
		}
	}
	dfs(1,n,1);
	printf("%lld\n",f[1][n][1]);
	for(i=1;i<=n;i++) printf("%lld ",ans[i]);
	return 0;
}
2021/8/14 15:57
加载中...